如何在出现 UnicodeDecodeError 错误的情况下继续处理文件



我得到了大约 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. 它尝试运行具有多种格式的失败文件可能/可用?旁注:请给出一个常见的列表文件格式(如果可以)。

  2. 即使在 特定数据行不能由任何格式处理 在上面的 1 中指定?

  3. 以优雅和蟒蛇的方式完成所有这些工作。

这是我处理文件的原始代码

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并相应地解码文件。

相关内容

最新更新