我得到了大约 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 中指定?
-
以优雅和蟒蛇的方式完成所有这些工作。
这是我处理文件的原始代码
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
谢谢。
如果文件以正确的方式编码,那么您必须先解码BOM (Byte order marker)
以找出编码。
您可以使用编解码器模块。它可以检测BOM并相应地解码文件。