Python 3.7读取二进制文件获字符串而非bytes对象问题求助
首先,你的写入代码是完全正确的——通过to_bytes(1, byteorder='big', signed=False)将每个整数转换为单字节二进制数据,并用wb模式写入,生成的testData.bin确实是标准的二进制文件。
而读取时得到字符串而非bytes对象,最核心的原因大概率是你实际运行读取代码的Python版本不是3.7,而是Python2,具体逻辑如下:
- 在Python3中,用
rb模式打开文件时,read()方法返回的是bytes对象,类型打印结果为<class 'bytes'>; - 但在Python2里,
rb模式打开文件后read()的结果是str类型(本质是字节串),类型显示为<type 'str'>,和你描述的运行结果完全吻合。
另外值得注意的是,你的写入代码用到了int.to_bytes()方法,这是Python3特有的API,所以写入操作肯定是在Python3环境下完成的,但读取时大概率误切换到了Python2环境。
排查与解决步骤
确认当前运行的Python版本
在读取代码开头添加一行版本打印代码,直接验证环境:import sys print(sys.version) # 打印当前Python版本 filename = sys.argv[1] # 后续读取代码保持不变如果输出是2.x系列版本,就坐实了环境版本错误的问题。
切换到Python3.7运行读取代码
如果你系统中同时安装了Python2和Python3,运行时明确指定Python3环境:python3 your_read_script.py testData.bin或者直接用
python3.7命令精准调用3.7版本:python3.7 your_read_script.py testData.bin验证二进制文件内容(可选)
如果你想确认testData.bin的内容是否符合预期,可以用十六进制查看工具(比如hexdump)检查:hexdump -C testData.bin文件开头应该显示
65 01 00 02 0a 03 01 04 00(对应第一个message的[101,1,0,2,10,3,1,4,0]),这说明文件本身没有问题。
补充建议
建议统一使用Python3环境运行所有相关代码,Python2已经停止维护,版本差异很容易导致这类类型混淆的问题,切换到Python3能从根源上避免这类兼容性坑。
内容的提问来源于stack exchange,提问作者Nikita Belooussov




