首页 > 解决方案 > 在python3中逐行读取文件时如何获取有关UnicodeDecodeError的有意义的位置信息

问题描述

UnicodeDecodeError通知用户无法解码的代码点的位置。但是,当使用文件对象上的其他方法时,read()由于缓冲,该位置对文件毫无意义。

假设我创建了一个这样的文件

#!/usr/env/python3
#coding: utf8

text = 100000* u"abcd\n" + u"ß\n"

with open("/tmp/test.txt", "w", encoding="iso-8859-1") as fi:
    fi.write(text)

然后read()给出真实位置

open("/tmp/test.txt", "r", encoding="utf-8").read()
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdf in position 500000: invalid continuation byte

而其他方法没有

open("/tmp/test.txt", "r", encoding="utf-8").readlines()
# -> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdf in position 288: invalid continuation byte

这同样适用于其他阅读方法,如for line in <file_obj>等。

是否有一种范式方法可以在没有太多样板代码或额外的解析步骤来检测该位置的情况下获得具有文件原始位置的有意义的错误消息(以便最终用户可能理解它)?


顺便说一句,在遍历行时,由于缓冲,甚至不能保证异常发生在同一行中,如下例所示:

#!/usr/env/python3
#coding: utf8

with open("/tmp/test.txt", "w", encoding="iso-8859-1") as fi:
    for num in range(100000):
        fi.write(u"valid line {}\n".format(num))
    fi.write(u"ß\n")

try:
    with open("/tmp/test.txt", "r", encoding="utf-8") as fi:
        for line in fi:
            pass
except UnicodeDecodeError:
    print(line)
    # -> valid line 99920

标签: python-3.xencodingtext-processing

解决方案


推荐阅读