【问题标题】:How do I continue to process a file despite a UnicodeDecodeError error?尽管出现 UnicodeDecodeError 错误,我如何继续处理文件?
【发布时间】: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. 它会尝试运行一个失败的文件,但文件格式尽可能多 可能/可用? 旁注:请列出常见的列表 文件格式,如果可以的话

  2. 即使在 任何格式都无法处理特定的数据行 上面 1 中指定?

  3. 以优雅和 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 字符并继续使用好的字符。谢谢

标签: python file-io


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2012-09-19
    • 2013-02-10
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多