Python读取文件和识别UnicodeDecodeError的源代码

问题描述 投票:1回答:3

我试图使用以下语句读取文本文件:

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错误时正在读取的输入文件的记录。

python file python-unicode
3个回答
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)

0
投票

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

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

0
投票

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

with open(inputFile, encoding="utf8") as fp:
© www.soinside.com 2019 - 2024. All rights reserved.