我一直在网上寻找一种解决方案,以解决读取具有不同编码格式的文件的问题,而且我发现了许多“无法分辨文件编码是什么”的实例(因此,如果有人正在阅读并具有链接,我会很感激)。但是,我要处理的问题比“打开任何文件编码”要集中得多,而要打开一组已知的编码。我绝不是这个主题的专家,但我想我应该发布解决方案,以防有人遇到此问题。
具体示例:
已知的文件编码: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。
我将以此为答案,但是如果有人有更好的解决方案,我也将不胜感激:)
答案 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,直到发生错误并且不需要就地错误处理为止。