Python 打开假定混合编码的 CSV 文件?

Python open CSV file with supposedly mixed encodings?

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

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

Codec can't decode byte 08xf

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

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

#也尝试过编码
打印(打开(路径,编码="utf-16")。读取()。编码('utf-8'))

Illegal UTF-16 surrogate

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

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

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

编辑:

刚刚尝试使用此答案中的代码:

导入 csv

以 open('source.csv', newline='', encoding='utf-8') 作为 f:
    reader = csv.reader(f)
    对于 reader 中的行:
        打印(行)

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

cp850.py, line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_map)[0] UnicodeEncodeError: 'charmap' codec can't encode characters in position 62-63: character maps to

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

你的 python 是什么版本? 如果使用 2.x 尝试将导入粘贴到脚本的开头:

from __future__ import unicode_literals

不如试试:

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

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

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

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

因此,您可以使用:

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