尽管出现UnicodeDecodeError错误,如何继续处理文件?

时间:2013-12-17 03:57:38

标签: python file-io

我有大约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个记录才能使文件失败。为了省略尽可能少的数据-i.e.不只是放弃整个文件因为我遇到了编解码器错误 - 我应该如何格式化我的脚本以便:

  1. 它尝试使用尽可能多的格式运行失败的文件 可能/可用? 旁注:请列出常见的清单 文件格式,如果你可以

  2. 即使在以下情况下也要继续处理文件     任何格式都无法处理特定的数据行     上面1中指定的?

  3. 以优雅和pythonic的方式完成所有这些。

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

    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                                
    

    感谢。

1 个答案:

答案 0 :(得分:0)

如果文件以正确的方式编码,那么您必须首先解码BOM (Byte order marker)以找出编码。

您可以使用codec模块。它可以检测BOM并相应地解码文件。