Python读取文件并识别UnicodeDecodeError

时间:2019-03-05 22:33:20

标签: python file python-unicode

我正在尝试使用以下语句读取文本文件:

with open(inputFile) as fp:  
    for line in fp:
        if len(line) > 0:
            lineRecords.append(line.strip());

问题是出现以下错误:

return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 6880: character maps to <undefined>

我的问题是我如何才能准确确定错误在文件中的哪个位置,因为Python给出的位置与当时正在读取的记录中的位置(而不是文件中的绝对位置)相关联。那么是记录20中的6,880个字符还是记录2000中的6,880个字符?没有记录信息,Python返回的位置值就一文不值。

底线:是否有办法让Python告诉我在遇到错误时它正在处理什么记录?

(是的,我知道0x9d是制表符,我可以进行搜索,但这不是我想要的。)

谢谢。

更新:UnicodeEncodeError: 'charmap' codec can't encode - character maps to <undefined>, print function上的帖子与我所问的问题无关-这是我如何让Python告诉我它遇到unicode错误时正在读取输入文件的记录。

3 个答案:

答案 0 :(得分:1)

我认为唯一的方法是单独跟踪行号并自己输出。

with open(inputFile) as fp:
    num = 0
    try:
        for num, line in enumerate(fp):
            if len(line) > 0:
                lineRecords.append(line.strip())
    except UnicodeDecodeError as e:
        print('Line ', num, e)

答案 1 :(得分:0)

您可以使用文件对象的read方法来获取前6880个字符并对其进行编码,结果字节对象的长度将成为有问题的字符的起始字节的索引:

with open(inputFile) as fp:
    print(len(fp.read(6880).encode()))

答案 2 :(得分:0)

我以前曾经遇到过这个问题,最简单的解决方法是以utf8模式打开文件

with open(inputFile, encoding="utf8") as fp: