奇怪的csv.reader与excelexported cs的行为

2024-06-28 18:48:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试分析从Excel保存的csv,发现默认情况下这些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的内容是:

^{pr2}$

输出是

^{3}$

如果我放弃所有字符编码处理,让库做他们想做的任何事情,我就不会有这种行为。相反,它似乎有效:

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是一个控制代码,当拉丁语-1转换为unicode时,它的意思是“换行”。在

如果是这样,我想我需要一种方法来阻止这种情况的发生。在

编辑2:这也是相关的:http://mg.pov.lt/blog/latin1-or-cp1252

cp1252看起来很像iso-8859-1(又名拉丁语-1)。我一开始考虑过这个问题,但把它称为“windows-1252”。使用输入编码“cp1252”的初步研究看起来很有希望。在


Tags: csvtopath编码for情况isoopen
1条回答
网友
1楼 · 发布于 2024-06-28 18:48:30

经过一番挖掘,我找到了解决这个问题的办法。上面EDIT2中的最后一个链接使我意识到一个我不知道存在的字符编码:“cp1252”。不幸的是,cp1252中的“normal”字符相当于iso-8859-2的“newline”字符。因此,如果您显式地将cp1252编码的文件读入iso-8859-2,您将得到您不期望的新行,这正是破坏csv解析器的原因。在

另外请注意,尽管windows-1252和cp1252有明显的相似之处,但至少在解析字节时可能会导致其中一个异常而不是另一个异常-我不知道这些编码之间的确切差异的任何细节。在

还请注意,我最初是基于对数据运行chardet来确定字符编码的iso-8859-2,这给了我80%的概率——这还不够高:)

对于这个问题的长期解决方案,我在我的软件中列出了我期望从csv得到的常见编码格式,并按可能性顺序进行了尝试,直到我得到一个解析的csv,并输出一个我期望的形状的csv(在本例中,正是矩形的)——这两个部分都很重要,因为文件可能使用错误的编码进行解析,但可能不是产生一个结构合理的csv。在

相关问题 更多 >