Метод .encode
применяется к строке Unicode для создания байтовой строки; но вы называете это байтовой строкой вместо ... неправильным способом! Посмотрите на модуль codecs
в стандартной библиотеке и codecs.open
, в частности, для улучшения общих решений для чтения текстовых файлов с кодировкой UTF-8. Тем не менее, для модуля csv
, в частности, вам необходимо передать данные utf-8, и это то, что вы уже получаете, поэтому ваш код может быть намного проще:
import csv
def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
for row in csv_reader:
yield [unicode(cell, 'utf-8') for cell in row]
filename = 'da.csv'
reader = unicode_csv_reader(open(filename))
for field1, field2, field3 in reader:
print field1, field2, field3
PS: если окажется, что ваши входные данные НЕ находятся в utf-8, но, например, в ISO-8859-1 вам понадобится «перекодирование» (если вы хотите использовать utf-8 на уровне модуля csv
) формы line.decode('whateverweirdcodec').encode('utf-8')
, но, вероятно, вы можете просто использовать имя существующей кодировки в строке yield
в моем коде выше, а не 'utf-8'
, поскольку csv
на самом деле будет очень хорошо соответствовать ISO-8859- * закодированным байтам.