Python csv: UnicodeDecodeError错误

10 投票
2 回答
7310 浏览
提问于 2025-04-16 02:45

我正在用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)

我一直在查看csv文档和StackOverflow上关于这个问题的许多其他问题。我觉得,£变成\xa3在ASCII中意味着原始的CSV文件是UTF-8格式。

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

如果它是UTF-8格式,那么csv模块应该能处理它吧?看起来它把所有符号都转换成了ASCII,尽管文档声称它支持UTF-8。

我尝试添加一个unicode_csv_reader函数,正如csv示例中所描述的,但这并没有帮助。

---- 编辑 -----

我需要澄清一件事。我看到过这个问题,看起来非常相似。但是添加那里的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

所以,也许我的文件根本就不是UTF-8格式?我该怎么判断呢?

2 个回答

0

如果你在使用Windows系统,通常你应该使用的编码方式是cp125X系列中的一种。例如,如果你在西欧或美洲,通常用的是cp1252。Windows的软件常常会使用从\x80\x9F这个范围的字节来编码一些特殊的标点符号,而在ISO-8859-X中,这个范围是留给不常用的“C1控制字符”的。

你可以通过在命令行中运行以下命令来查看你所在地区常用的编码:

python -c "import locale; print locale.getpreferredencoding()"
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£
>>>

撰写回答