Кажется, это должно быть легко исправить, но до сих пор решение ускользало от меня. У меня есть CSV-файл с одним столбцом с символами, отличными от ascii, сохраненными в utf-8, которые я хочу прочитать и сохранить в списке. Я пытаюсь следовать принципу «Unicode Sandwich» и декодировать при чтении файла в:
import codecs
import csv
with codecs.open('utf8file.csv', 'rU', encoding='utf-8') as file:
input_file = csv.reader(file, delimiter=",", quotechar='|')
list = []
for row in input_file:
list.extend(row)
Это приводит к ужасному кодеку «не может кодировать символы в позиции, порядковый номер не в диапазоне ( 128)' ошибка.
Я также пытался адаптировать решение из этого ответа, которое возвращает аналогичную ошибку.
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 = 'inputs\encode.csv'
reader = unicode_csv_reader(open(filename))
target_list = []
for field1 in reader:
target_list.extend(field1)
Очень похожее решение, адаптированное из документов, возвращает ту же ошибку.
def unicode_csv_reader(utf8_data, dialect=csv.excel):
csv_reader = csv.reader(utf_8_encoder(utf8_data), dialect)
for row in csv_reader:
yield [unicode(cell, 'utf-8') for cell in row]
def utf_8_encoder(unicode_csv_data):
for line in unicode_csv_data:
yield line.encode('utf-8')
filename = 'inputs\encode.csv'
reader = unicode_csv_reader(open(filename))
target_list = []
for field1 in reader:
target_list.extend(field1)
Очевидно, я что-то упускаю. Большинство вопросов, которые я видел относительно этой проблемы, по-видимому, относятся к Python 2.7, поэтому обновление здесь может быть полезным.