python-3.x - 在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
解决方案
推荐阅读
- docker - 使用 docker COPY 时如何做 ../
- react-apollo - 迁移后如何更新存储
- elasticsearch - 弹性:startOffset 必须是非负数,endOffset 必须 >= startOffset,并且偏移量不能向后走
- javascript - 未使用的财产下降了?
- c# - UWP SerialDevice 通信属性访问错误
- angular - 轮播幻灯片不适用于图像的后端数据
- msbuild - Teamcity - Msbuild“权限不足”错误的声纳扫描仪
- android - 如何在屏幕上获取当前使用的应用程序名称?
- java - 从 Servlet 创建目录并将文件保存在网络位置
- r - 合并行,NA R