繁体   English   中英

如何解决:使用.csv文件的Python导入Dictreader在未定义的字符上失败

[英]How to address: Python import of file with .csv Dictreader fails on undefined character

首先,我发现以下内容与我的问题基本相同,但它已经关闭,我不确定我理解结束的原因与帖子的内容。 我也没有真正看到一个有效的答案。

我有来自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)我选择了“dialect ='excel'”; 因为许多输入是Excel文件,可以从其中一个源应用程序下载。 从dictreader上的文档来看,我的印象是这只是定义了分隔符,引用字符和期望/使用的EOL字符。 因此,我不认为这是我的问题,但我也是一个Python菜鸟,所以我不是百分百肯定。

我在上面的评论中发布了我的解决方案; open()errors参数设置为'ignore'

with open(file, newline = '', errors='ignore') as f: 

这正是我在上面原帖中的第一个问题中寻找的(即是否有办法告诉csv.DictReader忽略未定义的字符)。

更新:后来我确实需要使用一些Unicode字符,并且不能忽略它们。 基于Excel生成的unicode .csv文件的解决方案的正确答案是使用'utf_8_sig'编解码器。 这将删除Windows在文件顶部写入的字节顺序标记(utf-16 BOM),以便让它知道其中有unicode字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM