我试图使用以下语句读取文本文件:
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错误时正在读取的输入文件的记录。
我认为唯一的方法是分别跟踪行号并自行输出。
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)
您可以使用文件对象的read
方法获取前6880个字符,对其进行编码,结果字节对象的长度将是有问题字符的起始字节的索引:
with open(inputFile) as fp:
print(len(fp.read(6880).encode()))
我之前遇到过这个问题,最简单的解决方法是在utf8模式下打开文件
with open(inputFile, encoding="utf8") as fp: