python - 为什么在使用 python 读取文件的过程中会出现 unicode 编码错误?
问题描述
我正在尝试制作一个程序来读取txt文件中读取“hwlog read”的每一行,并且它运行良好,直到文件中间,它返回
(return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 2856: character maps to undefined)
读取程序的代码部分是
with open(name, "r") as f:
print("DEBUG")
for line in f:
if len(line.split()) == 5:
if line.split()[-2] == "hwlog" and line.split()[-1] == "read":
input(line)
前几次,它工作正常
lhsh BXP_1024 hwlog read
lhsh BXP_1024_1 hwlog read
lhsh BXP_1024_2 hwlog read
lhsh BXP_1025 hwlog read
lhsh BXP_1025_4 hwlog read
lhsh BXP_1025_5 hwlog read
lhsh BXP_2048 hwlog read
lhsh BXP_2049 hwlog read
lhsh BXP_2050 hwlog read
lhsh BXP_2051 hwlog read
lhsh BXP_2052 hwlog read
但是在第 240070 行之后,它会返回之前的错误。我尝试将文件重新转换为 UTF-8,甚至尝试重新安装 python 并在其他设备上尝试,但它继续发生。为什么会发生这种情况,我该如何解决这个问题?
解决方案
您的文件中包含非 ASCII 字符。Python 3 将使用操作系统中配置的默认编码打开文件,如果您encoding
在打开文本文件时没有明确参数 - 在这种特殊情况下,我无法告诉你它是什么编码 - 它不是 utf-8 或latin1,因为一个会给出不同的错误消息(“无效的起始字节”),另一个不会因 0x81 而失败。
使用 latin1 可能会在没有 UnicodeDecodeException 的情况下读取您的文件 - 但是,您的数据仍然会被破坏 - 因为“0x81”在 Latin1 中不是有意义的字符- 所以首先尝试找出文件的文本编码。
如果当我谈论“发现文件的编码是什么”时感觉模棱两可,我强烈建议您在继续任何任务之前立即阅读这篇文章。
现在,尝试猜测“\x81”本身在 utf-8 中没有意义,它可能是编码为 b“\xc3\x81”的 'Á' 字符的第二个字节。
因此,您可以尝试一下 - 只需将您的文件打开行更改为:
with open(name, "r", encoding="utf-8") as f:
如果它没有产生错误,那么文件是 utf-8,因为值 > 127 的字节必须有一个有意义的序列,不会偶然遇到。
否则,只需将编码设置为“latin-1” - 它执行从字节到 unicode 代码点的透明转换,但请注意您正在将mojibake插入数据中。
推荐阅读
- c - C - Float Imprecision,如何锁定计算的小数位?
- python-3.x - /usr/bin/ld 中缺少 python-rocksdb 安装 -llz4
- mysql - 存储过程中的 MySQL 解除阻塞
- swift - 如何在 Swift 的 Stripe 中的 STPAddCardViewController 中显示“支付”而不是“完成”
- python-3.x - 如何将我的程序添加到右键单击上下文菜单并传递它的路径
- reactjs - 为什么我的 React Dom 渲染方法不起作用?
- kong - 在插件 jwt-keycloak Kong 中分配不同的角色
- android - Android / Kotlin - 通过按下导航菜单按钮失去对文本字段的关注后,片段未附加到活动
- java - Maven 多模块根 POM 与父 POM
- python - 如何在signals.py文件中获取当前登录的用户?