这似乎应该是一个简单的解决方案,但到目前为止,我还没有找到解决方法。我有一个保存在UTF-8编码下具有非ASCII字符的单列CSV文件,我想要将其读入并存储在列表中。我试图遵循"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)
这会导致可怕的“codec can't encode characters in position, ordinal not in range(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之前,因此在这里更新可能会有用。