【问题标题】:Strange csv.reader behaviour with excel-exported csvexcel 导出的 csv 的奇怪 csv.reader 行为
【发布时间】: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”的初步调查看起来很有希望。

【问题讨论】:

    标签: python excel csv encoding


    【解决方案1】:

    经过大量挖掘,我找到了解决方案。上面 EDIT2 中的最后一个链接让我知道了一个我不知道存在的字符编码:“cp1252”。不幸的是,cp1252 中的“正常”字符等同于 iso-8859-2“换行符”字符。因此,如果您将 cp1252 编码文件显式读取为 iso-8859-2,您将在不希望出现的地方得到换行符,这就是破坏 csv 解析器的原因。

    还要注意,尽管 windows-1252 和 cp1252 有明显的相似之处,但它们并不相同,至少在解析字节可能会导致一个异常而不是另一个异常 - 我没有任何关于确切的详细信息这些编码之间的差异。

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

    为了在我的软件中解决这个问题的长期解决方案,我列出了我期望从 csvs 获得的常见编码格式,我按可能性顺序尝试它们,直到我得到一个可以解析的格式,并输出形状的 csv我期望(在这种情况下,完全是矩形) - 两个部分都很重要,因为文件可能会使用错误的编码进行解析,但可能不会产生结构合理的 csv。

    【讨论】:

    • 接受我自己的回答。不仅傲慢,而且是唯一可用的答案:)
    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多