【问题标题】:Unicode CSV PythonUnicode CSV Python
【发布时间】:2016-11-14 17:25:59
【问题描述】:

我无法做到这一点。我有一个 CSV 文件,其中已经编码了字符(我制作了一个较小的 CSV 文件进行测试,但原始文件更长):

伊斯坦 H\xe1ta M\xf6g\xf6tt
西格 R\xf3s
\xd3lafur

我无法解码这些字符串。我尝试通过简单地读取该行然后执行 line.decode('latin1') 对其进行解码,但它似乎不起作用。当我查看原始字符串时,我注意到这些字符被一个额外的反斜杠转义了。因此,我尝试在解码之前先对原始字符串进行 unicode-escape;这似乎也不起作用。字符串保持原样(尽管在原始字符串中删除了额外的反斜杠)。

当我用示例项目对手动列表进行硬编码时,解码工作正常,我得到正确的字符。

所以,只有当我从 CSV 文件中读取它时,它才能正常工作。有人知道哪里出错了吗?

【问题讨论】:

  • 这是 python 2.x 还是 3.x?
  • 这是python 2.7
  • 您最初是如何在文件中获取该文本的?它的双重编码。
  • 这些数据不是我自己创建的。试图弄清楚如何从中获得正确的文本。为什么当我手动将它放入字符串/列表时它会很好,但是当我从 CSV 中读取它时却不起作用?
  • 如果您将foo = "Isten H\xe1ta M\xf6g\xf6tt" 放入python 脚本,python 会以与bar = "one\ntwo\nthree\n" 中的换行符相同的方式对其进行转义。如果将完全相同的文本放在 csv 文件中,则 python 编译器不会对其进行解析,也不会进行转义。这就是string_escape 编码的用途。似乎有人使用 python 打印字符串列表,然后将它们复制/粘贴到文件中。不要那样做!

标签: python csv unicode


【解决方案1】:

字符在内存和文件中具有不同的表示形式。字符串可以用多种方式编码,包括latin-1 编码或utf-8,但在这种情况下,我们看到文字\xf6,我们所拥有的是一个已转义的字符串。我们可以通过解码转义来解决这个问题

>>> print open('data.csv').readline().decode('string_escape')
Isten H�ta M�g�tt

但这只是让我们成功了一半,我们仍然被编码。现在是双重解码

>>> print open('data.csv').readline().decode('string_escape').decode('latin1')
Isten Háta Mögött

知道了!问题出在文件中。

【讨论】:

    【解决方案2】:
    >>> mystring = 'Sigur R\xf3s'
    >>> print mystring
    Sigur R�s
    >>> print mystring.decode('latin-1')
    Sigur Rós
    

    似乎在 python 2.7 上运行良好,你能显示一些代码和它产生的错误吗?

    【讨论】:

    • 这是我尝试过的,然后就可以了。从 CSV 读取时,我无法让它工作
    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 2017-06-07
    • 1970-01-01
    • 2013-07-05
    • 2017-01-18
    • 2017-12-23
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多