【问题标题】:How to avoid UnicodeDecodeError when working with differently encoded files?处理不同编码的文件时如何避免 UnicodeDecodeError?
【发布时间】:2017-05-01 17:10:52
【问题描述】:

我必须将包含数据集的 ASCII 文件合并到一个整体文件中。我正在使用标准程序执行逐行合并:

for in_filename in os.listdir(w_dir):
    if in_filename.endswith(".scd"):
        write_message("\nAdding '" + in_filename + "' to '" + out_filename + "' ... ", "black")
        with open(out_filename, 'a', encoding="utf-8") as f_out, fileinput.input(in_filename) as f_in:
            for scd_count, line in enumerate(f_in):
                f_out.write(line)

问题是,我要合并的 ASCII 文件的编码方式不同。当我使用能够自动识别编码的文本编辑器打开它们时,我会看到 utf-8、ISO 8859-15、ISO 8859-1 以及谁知道还有什么。因此,无论我明确告诉 Python 使用哪种编码,我的程序迟早都会遇到 UnicodeDecodeError。有没有办法避免这个问题?

【问题讨论】:

    标签: python encoding


    【解决方案1】:

    chardet 库对于猜测文件编码很有用。

    【讨论】:

    • 这可能有效,但不幸的是,根据常见问题解答,它似乎太慢了。我需要合并大量文件,总行数超过 150.000 行。我还认为这个库效率低下,因为它试图根据文件中使用的语言来猜测编码。但是我的文件只包含一个相对较小的标题,其中可能包含特定于语言的文本,而大多数文件由纯数据(数字和字符)组成。
    • @Grendel 还有cchardet 虽然我从未尝试过。
    • 您好,我只想补充一点,通过使用 openhook 关键字在读取文件时更改编码,我找到了另一个可行的解决方案: with open(out_filename, 'a', errors="ignore" ) 作为 f_out, fileinput.input(in_filename, openhook=fileinput.hook_encoded("latin-1")) 作为 f_in:
    猜你喜欢
    • 1970-01-01
    • 2019-11-05
    • 2018-11-19
    • 2020-09-20
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多