Python中UTF-8格式的CSV文件输入问题

21

这似乎应该是一个简单的解决方案,但到目前为止,我还没有找到解决方法。我有一个保存在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之前,因此在这里更新可能会有用。


1
错误信息表明它可能正在尝试将数据解码为ASCII... - Lev Levitsky
1
你的第二个例子对我来说是有效的,也许你的csv模块已经损坏了,我建议你升级你的Python?或者错误可能出现在其他地方。 - Antti Haapala -- Слава Україні
1
@AnttiHaapala 我的 Python 版本是几周前从一个干净的 Windows 安装中获取的,版本为 2.7.3。 - acpigeon
1
啊,原来你并不是在制作三明治。你得到了Unicode,但是Python在某个时候试图将其悄悄转换为ASCII。 - Lev Levitsky
1
抱歉约翰,我正在尝试从一个较大的脚本中隔离出问题代码片段,因此我已将无关的块注释掉了。我尝试将第二个片段移动到测试文件中,错误似乎消失了。我将尝试逐步重建我的原始脚本,并将结果更新。 - acpigeon
显示剩余17条评论
3个回答

18

你的第一个代码片段无法正常工作。你正在向csv reader提供unicode数据,但它(如文档中所述)无法处理。

你的第二个和第三个代码片段有些混淆了。只需要像下面这样的代码即可:

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

这个可以工作。不确定原始脚本中的具体问题是什么,但生活就是如此。谢谢。 - acpigeon

12

如果在读取文件的第一个字符时就失败了,可能是由于存在BOM。如果你的文件是UTF8编码并且开头存在BOM,可以使用codecs.open('utf8file.csv', 'rU', encoding='utf-8-sig')


-2
我建议尝试一下这个:

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

或者

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

CSV 应该支持 Unicode,并且应该可以正常工作。


它并不特别支持Unicode,但是你的示例也没有使用Unicode。 - Antti Haapala -- Слава Україні
没有所谓的“utf-8感知”。 - Antti Haapala -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接