首先,我发现以下内容与我的问题基本相同,但是已关闭,并且我不确定我了解关闭原因与帖子内容的关系。我也没有真正找到有效的答案。
我有来自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%。
我在上面的评论中发布了解决的方法;这是将的errors
参数设置open()
为'ignore'
:
with open(file, newline = '', errors='ignore') as f:
这正是我在上面原始帖子中的第一个问题中正在寻找的内容(即,是否有一种方法可以让csv.DictReader
忽略未定义的字符)。
更新:后来我确实需要使用一些Unicode字符,并且不能忽略它们。基于Excel产生的unicode .csv文件的该解决方案的正确答案是使用“ utf_8_sig”编解码器。这将删除Windows在文件顶部写入的字节顺序标记(utf-16 BOM),以使其知道其中包含unicode字符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句