首先,我发现the following与我的问题基本相同,但是已经关闭,并且我不确定我了解关闭原因与帖子内容的关系。我也没有真正找到有效的答案。
我有来自4个应用程序的20多个输入文件。所有文件都将导出为.csv文件。前19个文件有效(从同一应用程序导出的其他4个文件),然后我遇到一个文件,该错误提示我:
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 5762: character maps to <undefined>
如果我朝右看,那是一个&lt ctrl&gt。下面的代码是相关的行:
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)我选择了“方言='excel'”;因为许多输入是可以从源应用程序之一下载的Excel文件。从dictreader上的文档中,我的印象是,这仅定义了期望/使用的定界符,引号字符和EOL字符。因此,我不认为这是我的问题,但是我也是Python新手,所以我不确定100%。
答案 0 :(得分:1)
我在上面的评论中发布了解决的方法;就是将errors
的{{1}}参数设置为open()
:
'ignore'
这正是我在以上原始帖子的第一个问题中所要寻找的(即是否有一种方法可以告诉with open(file, newline = '', errors='ignore') as f:
忽略未定义的字符)。
更新:后来我确实需要使用一些Unicode字符,并且不能忽略它们。基于Excel产生的unicode .csv文件的解决方案的正确答案是使用'utf_8_sig'编解码器。这将删除Windows在文件顶部写入的字节顺序标记(utf-16 BOM),以使其知道其中包含unicode字符。