You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:17:36