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())
我正在尝试使用 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())