我正在使用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?我该怎么说?
答案 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()"