如何读取多种已知文件编码

时间:2019-04-06 16:42:22

标签: python python-3.x character-encoding

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

具体示例:

已知的文件编码:utf8和Windows ansi

初始问题:据我所知,未为python的open('file', 'r')命令指定编码会自动默认为encoding ='utf8'在尝试f.readline() ansi文件时会在运行时引发UnicodeDecodeError。对此的常见搜索是:“ UnicodeDecodeError:'utf-8'编解码器无法解码字节”

第二个问题:所以我想很好,很简单,我们知道正在引发的异常,因此请读一行,如果它引发此UnicodeDecodeError,则关闭文件并用open('file', 'r', encoding='ansi')重新打开。这样做的问题是,有时utf8能够很好地读取ansi编码文件的前几行,但随后却无法读取。现在解决方案变得清晰了。我必须用utf8读取整个文件,如果失败,那么我知道该文件是ansi。

我将以此为答案,但是如果有人有更好的解决方案,我也将不胜感激:)

2 个答案:

答案 0 :(得分:0)

f = open(path, 'r', encoding='utf8')
while True:
    try:
        line = f.readline()
    except UnicodeDecodeError:
        f.close()
        encodeing = 'ansi'
        break
    if not line:
        f.close()
        encoding = 'utf8'
        break

# now open your file for actual reading and data handling
with open(path, 'r', encoding=encoding) as f:

答案 1 :(得分:0)

如果您将链接问题中的编解码器替换为三元组,则为

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,直到发生错误并且不需要就地错误处理为止。