【问题标题】:Python open CSV file with supposedly mixed encodings?Python用所谓的混合编码打开CSV文件?
【发布时间】:2015-02-18 19:58:40
【问题描述】:

我正在尝试使用 Python 读取 CSV 文本文件(UTF-8,根据 Notepad++ 没有 BOM)。但是编码似乎有问题:

打印(打开(路径,编码=“utf-8”)。读取())

编解码器无法解码字节08xf

这个小字符似乎是问题所在:(完整字符串:“●• อีเปียขี้บ่น ت•●”),但我相信还会有更多。

如果我尝试 UTF-16,则会出现一条消息:

#也尝试了编码 print(open(path, encoding="utf-16").read().encode('utf-8'))

非法的 UTF-16 代理

即使我尝试使用自动编解码器查找器打开它,我也会收到错误消息。

def csv_unireader(f, encoding="utf-8"):
    对于 csv.reader(codecs.iterencode(codecs.iterdecode(f, encoding), "utf-8")) 中的行:
        yield [e.decode("utf-8") for e in row]

我忽略了什么?该文件包含 Twitter 文本,其中肯定包含许多不同的字符。但这在 Python 中不会是那么困难的任务,只是读取/打印文件?

编辑:

刚刚尝试使用此答案中的代码:https://stackoverflow.com/a/14786752/45311

导入 csv 使用 open('source.csv', newline='', encoding='utf-8') 作为 f: 阅读器 = csv.reader(f) 对于阅读器中的行: 打印(行)

这至少会在屏幕上打印一些行,但在某些行之后也会抛出错误:

cp850.py,第 19 行,在编码中 返回 codecs.charmap_encode(input,self.errors,encoding_map)[0] UnicodeEncodeError:“charmap”编解码器无法对位置 62-63 中的字符进行编码: 字符映射到

它似乎自动使用 CP850 这是另一种编码...我无法理解这一切......

【问题讨论】:

    标签: python csv encoding utf-8 character-encoding


    【解决方案1】:

    您可以在 open 函数中使用 errors 参数。您可以尝试以下选项之一(我从 python 文档中提取了描述):

    • 'ignore' 忽略错误。请注意,忽略编码错误可能会导致数据丢失。
    • “replace”会导致在存在格式错误的数据的位置插入替换标记(例如“?”)。
    • 'surrogateescape' 将在从 U+DC80 到 U+DCFF 的 Unicode Private Use Area 中将任何不正确的字节表示为代码点。当写入数据时使用 surrogateescape 错误处理程序时,这些私有代码点将被转换回相同的字节。这对于处理未知编码的文件很有用。

    所以,你可以使用:

    print(open(path, encoding="utf-8", errors="ignore").read())
    

    【讨论】:

    • 我知道它说要忽略错误,但奇怪的是我收到了同样的错误......“cp850.py,第 19 行,在编码返回 codecs.charmap_encode(input,self.errors,encoding_map )[0] UnicodeEncodeError: 'charmap' codec can't encode characters in position 62-63: character maps to"
    • 顺便说一下,我尝试读取一个只有这个大点字符的文件,效果很好。
    • 我认为我帖子中的最后一个代码(编辑后)在不同的字符上引发了异常......(只是经过双重检查,它是同一个字符)但是根据chardet 编码似乎成为ISO-8859-2
    • 可能是紧随其后的字符:(小点)
    【解决方案2】:

    你的 python 版本是多少? 如果使用 2.x 尝试在脚本开头粘贴导入:

    from __future__ import unicode_literals
    

    比尝试:

    print(open(path).read().encode('utf-8'))
    

    还有一个很棒的字符集检测工具:chardet。 希望对你有帮助。

    【讨论】:

    • chardet 在一个 25mb 的文件上运行了很长时间...感谢您的领导
    • 根据chardet编码为ISO-8859-2
    • 您是否先尝试解码,然后再编码? (.decode('iso-8859-2').encode('utf-8'))
    • 是的。我最终将文本复制/粘贴到一个新的文本文件中。这是目前可行的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 2012-04-18
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多