python - 如何解决 : Python import of file with . csv Dictreader 在未定义字符上失败

标签 python python-3.x file csv

首先,我找到了the following这与我的问题基本相同,但它已关闭,我不确定我是否理解关闭的原因与帖子的内容。我也没有真正看到有效的答案。

我有来自 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。由于源文件的手动生成/导出,我得到的结果可能存在一些差异。某些文件中也可能有一些奇怪的字符(例如日语、俄语等)。我提供此信息是因为返回源代码以获取不同的文件可能只会在我必须拉取更新数据(或更糟糕的是,其他人这样做)之前把 jar 头推到一边。

所以这个问题可能是多部分的:
1)有没有办法告诉 csv.DictReader 忽略未定义的字符? (解码器的提示:如果我看不到它,它对我没有任何值(value)。)

2) 如果我确实有“疯狂”的角色,我该怎么办?我考虑过将每个输入作为二进制文件打开,过滤掉有问题的十六进制字符,将文件写回磁盘,然后打开新文件,但这似乎是程序的很多开销,对我来说甚至更多。这也是 1977 年的一些 JCL 声明。

3) 如果在我读入时它崩溃了,我如何弄清楚我得到的输入是什么。

4)我选择了“dialect='excel'”;因为许多输入是 Excel 文件,可以从其中一个源应用程序下载。从 dictreader 上的文档来看,我的印象是这只是定义了预期/使用的分隔符、引号字符和 EOL 字符。因此,我不认为这是我的问题,但我也是 Python 菜鸟,所以我不能 100% 确定。

最佳答案

我在上面的评论中发布了我使用的解决方案;它是将 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 字符。

关于python - 如何解决 : Python import of file with . csv Dictreader 在未定义字符上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52087219/

相关文章:

Python 只打印最后一个回溯?

python - 根据 Pandas 另一个选项卡中的匹配项更改值

python - 扩展分层数据,根据列中的列表项创建新行

Python:检查数据文件是否相对于源代码文件存在

file - 如何修改Centos 5.5默认打开命令

python - 外键约束在 SQLite 上无法正常工作

python - 如何在 sqlalchemy 中返回执行原始查询

python - Python 3 制作表格(初级)

python - 如果匹配可以是单个字符串或字符串元组,如何测试字符串中是否存在匹配?

python实时写入文件