【发布时间】:2015-01-26 19:12:07
【问题描述】:
我一直在尝试解析从 Excel 中保存的 csv,默认情况下发现这些似乎是 ISO-8859-2(至少 chardet 有 80% 的把握是这样认为的),我可以让它们以这种方式解析.但是在解析后的版本中,一行被读出为两个单独的行。
我已经根据 csv 模块的文档设置了我的处理链,以使用正确的编码打开源文件,并通过UTF8Recoder 运行它以在读取时将其转换为 UTF-8。
大致是这样的:
f = codecs.open("/path/to/csv", "r+b", encoding="ISO-8859-2")
reader = csv.reader(UTF8Recoder(f))
for row in reader: print row
对于单行的 CSV,这是输出 2 行!
在命令行通过vim查看,csv的内容为:
UCL,,,10.1016/j.neuropsychologia.xxxx,Elsevier,Neuropsychologia,DAT genotype modulates striatal processing and long-term mem<85>,091593/Z/10/Z,,,CC BY,
输出是
['UCL', '', '', '10.1016/j.neuropsychologia.xxxx', 'Elsevier', 'Neuropsychologia', 'DAT genotype modulates striatal processing and long-term mem\xc2\x85']
['', '091593/Z/10/Z', '', '', 'CC BY', '']
如果我放弃所有字符编码处理,并让库为所欲为,我不会得到这种行为。相反,它似乎有效:
f = codecs.open("/path/to/csv", "r+b")
reader = csv.reader(f)
for row in reader: print row
输出是:
['UCL', '', '', '10.1016/j.neuropsychologia.xxxx', 'Elsevier', 'Neuropsychologia', 'DAT genotype modulates striatal processing and long-term mem\x85', '091593/Z/10/Z', '', '', 'CC BY', '']
任何人都可以了解发生了什么吗? (我注意到 \xc2\x85 已经变成了 \x85,如果这表明了什么)
我宁愿将传入的数据显式编码为 UTF-8,这样我就不必在我的应用程序的其他任何地方担心它,实际上我怀疑在导入期间不指定编码会导致其他问题,如果我在字符编码方面的经验值得借鉴!
非常感谢任何提示。
编辑:这似乎是相关的:http://www.voidspace.org.uk/python/weblog/arch_d7_2010_01_02.shtml
\x85 是控制码,当latin-1转换为unicode时表示“换行符”。
如果是这样,我想我需要一种方法来阻止这种情况的发生。
EDIT2:这也是相关的:http://mg.pov.lt/blog/latin1-or-cp1252
cp1252 看起来很像 iso-8859-1(又名 latin-1)。我最初考虑过这一点,但将其称为“windows-1252”。使用输入编码“cp1252”的初步调查看起来很有希望。
【问题讨论】: