Python csv: UnicodeDecodeError错误
我正在用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£
>>>