首页 > 解决方案 > 如何读取多个已知文件编码

问题描述

我一直在网上搜索解决读取具有不同编码的文件的解决方案,并且我发现了许多“无法分辨文件是什么编码”的实例(因此,如果有人正在阅读此内容并有链接,我将不胜感激它)。但是,我正在处理的问题比“打开任何文件编码”更集中,而是打开一组已知编码。我绝不是这个主题的专家,但我想我会发布我的解决方案,以防有人遇到这个问题。

具体例子:

已知文件编码:utf8 和 windows ansi

初始问题:据我所知,没有为 python 的open('file', 'r')命令指定编码自动默认为 encoding='utf8' 在尝试f.readline()使用 ansi 文件时在运行时引发 UnicodeDecodeError。对此的常见搜索是:“UnicodeDecodeError: 'utf-8' codec can't decode byte”

次要问题:所以我想好吧,很简单,我们知道正在引发的异常,所以请阅读一行,如果它引发了这个 UnicodeDecodeError 然后关闭文件并使用open('file', 'r', encoding='ansi'). 这样做的问题是,有时 utf8 能够很好地读取 ansi 编码文件的前几行,但在后面的行中却失败了。现在解决方案变得清晰了;我必须用 utf8 通读整个文件,如果失败了,我就知道这个文件是 ansi。

我将对此发表我的看法作为答案,但如果有人有更好的解决方案,我也将不胜感激:)

标签: pythonpython-3.xcharacter-encoding

解决方案


如果将链接问题中的编解码器替换为tripleee,则为

import codecs

last_position = -1

def mixed_decoder(unicode_error):
    global last_position
    string = unicode_error[1]
    position = unicode_error.start
    if position <= last_position:
        position = last_position + 1
    last_position = position
    new_char = string[position].decode("ansi")
    #new_char = u"_"
    return new_char, position + 1

codecs.register_error("mixed", mixed_decoder)

奖励:在发生错误之前读取为 UTF-8,并且不需要就地错误处理。


推荐阅读