Python读取info.dat时遇UnicodeDecodeError及TypeError问题求助
解决Python文件读取的编码错误问题
首先看你遇到的第一个错误:UnicodeDecodeError,这是因为你打开info.dat的时候,Python默认使用了ASCII编码来解码文件,但文件里包含了非ASCII字符(比如错误里提到的0xe4,这是UTF-8编码的ä)。解决这个问题的核心是打开文件时指定正确的文本编码。
然后第二个错误TypeError: can't concat str to bytes,是因为你把str类型的换行符和bytes类型的编码后文本拼接了——文本模式打开的文件('w')只能写入字符串,二进制模式('wb')才写入字节,你混淆了这两种模式的用法。
修正后的完整代码
# 打开源文件时指定编码,比如utf-8,避免解码错误 with open('info.dat', 'r', encoding='utf-8') as file: version = None for line in file: if line.startswith('$001,'): # 提取版本号,注意strip()去掉可能的换行符 version = line.strip()[5:8] break # 找到目标行后就停止遍历,提升效率 # 确认找到版本号后再写入文件 if version: with open('version.txt', 'w', encoding='utf-8') as w: w.write(version + '\n')
关键修改点说明:
- 指定文件编码:打开
info.dat时添加encoding='utf-8'参数,告诉Python用UTF-8编码解码文件,这样就能正确处理非ASCII字符了。如果不确定文件的具体编码,也可以尝试encoding='latin-1',或者用errors='ignore'临时跳过解码错误(比如open('info.dat', 'r', encoding='utf-8', errors='ignore')),但优先确认文件的实际编码更好。 - 避免重复打开写入文件:原代码每找到一次目标行就打开一次
version.txt,会覆盖之前的内容,而且没必要多次IO操作。我们先遍历找到版本号,再一次性写入。 - 处理字符串和字节的混淆:写入
version.txt时直接使用字符串即可,不需要encode或decode——因为文本模式打开的文件会自动处理编码转换,你只需要传入字符串就行。
额外提示
如果你的info.dat确实包含特殊字符,且你不确定它的编码,可以用chardet库来检测:
pip install chardet
然后用代码检测:
import chardet with open('info.dat', 'rb') as f: result = chardet.detect(f.read()) print(result['encoding']) # 输出文件的推测编码
内容的提问来源于stack exchange,提问作者user2217645
相关产品推荐
相关产品推荐

