首先,我发现下列 https://stackoverflow.com/questions/38019379/python-unicodedecodeerror-utf8-codec-cant-decode-byte-0x91这与我的问题基本相同,但它已关闭,我不确定我是否理解关闭的原因与帖子的内容。我也没有真正看到有效的答案。
我有来自 4 个应用程序的 20 多个输入文件。所有文件均导出为 .csv 文件。前 19 个文件有效(从同一个应用程序导出的其他 4 个文件有效),然后我遇到一个文件,该文件给了我这个错误:
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 5762: character maps to <undefined>
如果我查对了,它是一个 < ctrl >。下面的代码是相关行:
with open(file, newline = '') as f:
reader = csv.DictReader(f, dialect = 'excel')
for line in reader:
我知道我会收到一份文件。我知道这将是一个 .csv。由于手动生成/导出源文件,我得到的结果可能会有所不同。某些文件中也可能存在一些奇怪的字符(例如日语、俄语等)。我提供此信息是因为返回源头获取不同的文件可能只会拖延时间,直到我必须提取更新的数据(或更糟糕的是,其他人这样做)。
所以问题可能是多部分的:
1)有没有办法告诉 csv.DictReader 忽略未定义的字符? (编解码器提示:如果我看不到它,它对我来说没有任何价值。)
2)如果我确实有“疯狂”的角色,我该怎么办?我考虑过将每个输入作为二进制文件打开,过滤掉有问题的十六进制字符,将文件写回磁盘,然后打开新文件,但这对于程序来说似乎是很大的开销,对我来说甚至更多。这也是 1977 年 JCL 的一些声明。
3)如果我在读入时崩溃了,我该如何弄清楚我得到的输入是什么。
4)我选择了“dialect='excel'”;因为许多输入都是 Excel 文件,可以从源应用程序之一下载。从 dictreader 上的文档来看,我的印象是这只是定义了期望/使用的分隔符、引号字符和 EOL 字符。因此,我不认为这是我的问题,但我也是一个Python菜鸟,所以我不能100%确定。