3

网上有很多关于这个问题的话题,但我似乎找不到我的具体案例的答案。

我有一个 CSV 文件。我不确定对它做了什么,但是当我尝试打开它时,我得到:

UnicodeDecodeError:“utf8”编解码器无法解码位置 0 的字节 0xff:无效的起始字节

这是一个完整的Traceback

Traceback (most recent call last):
  File "keywords.py", line 31, in <module>
    main()
  File "keywords.py", line 28, in main
    get_csv(file_full_path)
  File "keywords.py", line 19, in get_csv
    for row in reader:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u5a07' in position 10:    ordinal    not in range(128)

在 Stack Overflow 的帮助下,我打开了它:

reader = csv.reader(codecs.open(file_full_path, 'rU', 'UTF-16'), delimiter='\t', quotechar='"')

现在的问题是,当我阅读文件时:

def get_csv(file_full_path):
    import csv, codecs
    reader = csv.reader(codecs.open(file_full_path, 'rU', 'UTF-16'), delimiter='\t', quotechar='"')
    for row in reader:
        print row

我被亚洲符号困住了:

UnicodeEncodeError:'ascii' 编解码器无法在位置 10 编码字符 u'\u5a07':序数不在范围内(128)

我已经在包含该字符的字符串上尝试了decode'encode' unicode(),但它似乎没有帮助。

for row in reader:
    #decoded_row = [element_s.decode('UTF-8') for element_s in row]
    #print decoded_row
    encoded_row = [element_s.encode('UTF-8') for element_s in row]
    print encoded_row

在这一点上,我真的不明白为什么。如果我

>>> print u'\u5a07'
娇

或者

>>> print '娇'
娇

有用。同样在终端中,它也可以工作。我已经检查了终端和 Python shell 上的默认编码,它到处都是 UTF-8。它可以轻松打印该符号。我认为这与我codecs使用 UTF-16 打开文件有关。

我不知道从这里去哪里。有人可以帮忙吗?

4

2 回答 2

5

csv模块无法处理 Unicode 输入。它在其文档页面上特别说明:

注意:此版本的csv模块不支持 Unicode 输入。此外,目前还有一些关于 ASCII NUL 字符的问题。因此,为了安全起见,所有输入都应该是 UTF-8 或可打印的 ASCII;

您需要将 CSV 文件转换为 UTF-8 以便模块可以处理它:

with codecs.open(file_full_path, 'rU', 'UTF-16') as infile:
    with open(file_full_path + '.utf8', 'wb') as outfile:
        for line in infile:
            outfile.write(line.encode('utf8'))

或者,您可以使用命令行实用程序iconv为您转换文件。

然后使用该重新编码的文件来读取您的数据:

 reader = csv.reader(open(file_full_path + '.utf8', 'rb'), delimiter='\t', quotechar='"')
 for row in reader:
     print [c.decode('utf8') for c in row]

请注意,这些列需要手动解码为 un​​icode。

于 2012-12-14T09:22:27.400 回答
-1

当您尝试将 unicode 字符转换为 8 位序列时,会出现编码错误。因此,您的第一个错误不是实际读取文件时出现的错误,而是稍后发生的错误。

您可能会收到此错误,因为 Python 2 CSV 模块希望文件处于二进制模式,而您打开它时它会返回 unicode 字符串。

将您的开口更改为:

reader = csv.reader(open(file_full_path, 'rb'), delimiter='\t', quotechar='"')

你应该没事。甚至更好:

with open(file_full_path, 'rb') as infile:
    reader = csv.reader(infile, delimiter='\t', quotechar='"')
    # CVS handling here.

但是,您不能使用 UTF-16(或 UTF-32),因为分隔字符是 UTF-16 中的两个字节字符,它无法正确处理,因此您需要将其转换为 UTF-8第一的。

于 2012-12-14T09:21:29.043 回答