Подтвердить что ты не робот

Проблема с вводом CSV UTF-8 в Python

Кажется, что это должно быть легко исправить, но до сих пор решение ускользало от меня. У меня есть один CSV файл столбца с символами non-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)

Очень похожее решение, адаптированное из docs, возвращает ту же ошибку.

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, поэтому обновление здесь может быть полезно.

4b9b3361

Ответ 1

Ваш первый фрагмент не будет работать. Вы загружаете данные Unicode в считыватель csv, который (как документировано) не может справиться с этим.

Ваш второй и третий фрагменты сбиты с толку. Вам понадобится следующее:

f = open('your_utf8_encoded_file.csv', 'rb')
reader = csv.reader(f)
for utf8_row in reader:
    unicode_row = [x.decode('utf8') for x in utf8_row]
    print unicode_row

Ответ 2

В этом случае с первого чтения char он не работает, у вас может быть спецификация. Используйте codecs.open('utf8file.csv', 'rU', encoding='utf-8-sig'), если ваш файл UTF8 и имеет спецификацию в начале.

Ответ 3

Я бы попробовал просто:

input_file = csv.reader(open('utf8file.csv', 'r'), delimiter=",", quotechar='|')

или

input_file = csv.reader(open('utf8file.csv', 'rb'), delimiter=",", quotechar='|')

csv должен быть знаком с unicode, и он должен просто работать.