Python csv:UnicodeDecodeError

时间:2010-08-13 19:02:21

标签: python encoding csv

我正在使用Python的csv模块读取文件,并且还有另一个编码问题(抱歉,这里有很多)。

在CSV文件中,有£符号。读完行并打印后,它们就变成了\ xa3。

尝试将它们编码为Unicode会产生UnicodeDecodeError

row = [unicode(x.strip()) for x in row]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa3 in position 0: ordinal not in range(128)

我一直在阅读关于StackOverflow的csv documentation和其他许多问题。我认为在ASCII中成为\ xa3表示原始CSV文件是UTF-8。

(顺便提一下,有没有快速检查CSV文件编码的方法?)

如果它是UTF-8,那么csv模块是否应该能够应对它?它似乎正在将所有符号转换为ASCII,即使文档声称它接受UTF-8。

我已尝试添加unicode_csv_reader函数,如csv examples中所述,但它没有帮助。

----编辑-----

我应该澄清一件事。我见过this question,看起来非常相似。但添加定义的unicode_csv_reader函数会产生不同的错误:

yield [unicode(cell, 'utf-8') for cell in row]
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa3 in position 8: unexpected code byte

所以也许我的文件毕竟不是UTF8?我该怎么说?

2 个答案:

答案 0 :(得分:7)

尝试使用“ISO-8859-1”进行编码。看起来你正在处理扩展的ASCII,而不是Unicode。

编辑:

这是一些处理扩展ASCII的简单代码:

>>> s = "La Pe\xf1a"
>>> print s
La Pe±a
>>> print s.decode("latin-1")
La Peña
>>>

更好的是,处理给你带来问题的确切角色:

>>> s = "12\xa3"
>>> print s.decode("latin-1")
12£
>>>

答案 1 :(得分:0)

如果您使用的是Windows,那么您应该使用的编码很可能是cp125X系列之一...例如如果您在西欧或美洲,那将是cp1252。 Windows软件通常使用\x80\x9F范围内的字节来编码花哨的标点字符,而ISO-8859-X中为很少使用的“C1控制字符”保留该范围。

您可以通过在命令行运行此命令来找到您的语言环境中的常用编码:

python -c "import locale; print locale.getpreferredencoding()"