在Python中使用UTF-8 CSV输入时出现问题

时间:2012-05-22 21:27:12

标签: python encoding utf-8

这似乎应该是一个简单的修复,但到目前为止,我找不到解决方案。我有一个单列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)'错误。

我也尝试过调整this answer的解决方案,它会返回类似的错误

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,所以这里的更新可能会有用。

3 个答案:

答案 0 :(得分:17)

您的第一个代码段不起作用。您正在将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

答案 1 :(得分:12)

在第一个char读取失败时,您可能有BOM。如果您的文件是UTF8且在开头有BOM,请使用codecs.open('utf8file.csv', 'rU', encoding='utf-8-sig')

答案 2 :(得分:-2)

我建议你试试:

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

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

csv应该是unicode,它应该可以工作。