【发布时间】:2015-05-28 16:49:05
【问题描述】:
我得到了大约 10,000 个文件,其中总共有大约 5000 万条记录。这些文件来自不同的来源。我需要读取和处理这些文件中的所有行。这些文件应该是 ASCII,但考虑到创建文件时使用的不同处理环境,很多文件都会破坏这种格式。
处理时,我经常遇到编解码器错误,例如
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 106: character maps to <undefined>。
另一个错误是
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte
如果我更改编解码器格式,文件会被处理,但随后几个文件又会引发不同的编解码器错误。
此外,文件并不总是在文件开头失败。一个文件可以处理到 50,000 条记录,但它会失败。为了尽可能少地遗漏数据 - 即不只是退出整个文件,因为我遇到了编解码器错误-,我应该如何格式化我的脚本以便:
它会尝试运行一个失败的文件,但文件格式尽可能多 可能/可用? 旁注:请列出常见的列表 文件格式,如果可以的话。
即使在 任何格式都无法处理特定的数据行 上面 1 中指定?
以优雅和 Python 的方式完成这一切。
这是我处理文件的原始代码
with codecs.open(file_path, encoding="utf8") as f:
for file in f:
`some long code to read the file and dump it to database`
经过一番谷歌搜索后,我现在看到了以下代码,这对我来说不是很优雅,因为我不可能为所有不同的文件格式重复所有代码:
codec_option = 0
while True:
try:
if codec_option == 0:
with codecs.open(file_path, encoding="utf8") as f:
for line in f:
`some long code to read the file and dump it to database. when done, break`
elif codec_option == 1:
with codecs.open(file_path, encoding="cp1252") as f:
for line in f:
`some long code to read the file and dump it to database. when done, break`
except UnicodeDecodeError:
codec_option += 1
continue
return entry_counter
谢谢。
【问题讨论】:
-
您可以尝试使用chardet 猜测文件的编码。
-
确保:您了解ascii(7 位字符编码)和"ansi, extended ascii"(不要使用该术语)之间的区别。
-
您尝试过
encoding='ascii', errors='ignore'或其他错误处理程序吗? -
即使一一列举所有可用的字符编码也不能保证不会发生错误。即使没有错误;这并不意味着结果不是垃圾。您可以根据自己的具体情况决定明智的做法:删除、替换、使用任意编码解码、按原样传递字节。
-
@J.F.Sebastian 我放弃了并接受了您的建议,并添加了
errors=ignore,它替换/删除了odd/bad字符并继续使用好的字符。谢谢