You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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环境。

排查与解决步骤

  1. 确认当前运行的Python版本
    在读取代码开头添加一行版本打印代码,直接验证环境:

    import sys
    print(sys.version)  # 打印当前Python版本
    filename = sys.argv[1]
    # 后续读取代码保持不变
    

    如果输出是2.x系列版本,就坐实了环境版本错误的问题。

  2. 切换到Python3.7运行读取代码
    如果你系统中同时安装了Python2和Python3,运行时明确指定Python3环境:

    python3 your_read_script.py testData.bin
    

    或者直接用python3.7命令精准调用3.7版本:

    python3.7 your_read_script.py testData.bin
    
  3. 验证二进制文件内容(可选)
    如果你想确认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

火山引擎 最新活动