Преобразование значений байтового массива в порядке с прямым порядком байтов в короткие значения

Метод .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- * закодированным байтам.

21
задан UnclickableCharacter 7 February 2015 в 10:17
поделиться