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

Python中如何在rb模式下仅读取字节而非字符?

解决二进制文件读取时字节被解析为字符的问题

问题出在你把读取到的二进制bytes对象直接转成了字符串:str(f.read(byteAdressEnd))。Python的str()会自动把字节中可打印的ASCII字符(比如0x76对应'v'、0x75对应'u')直接显示为字符,而不是保留\xXX的十六进制字节格式,这就造成了你看到的“字节被合并、替换成字符”的假象。

正确的处理方式

  1. 保留原始二进制数据
    读取文件后直接用bytes类型存储,不要转成字符串:

    f = open('tree.sgi', 'rb')
    byteAdressEnd = 24
    byte_data = f.read(byteAdressEnd)
    

    此时byte_data是纯粹的二进制字节序列,完全保留文件中的原始字节信息。

  2. 格式化查看十六进制字节(如果需要)
    如果要查看字节的十六进制表示,避免字符解析干扰,可以用以下两种方式:

    • 方式一:遍历字节格式化输出
      # 输出每个字节的两位十六进制格式,用空格分隔
      formatted_output = ' '.join(f'{byte:02x}' for byte in byte_data)
      print(formatted_output)
      
    • 方式二:用binascii工具转换
      import binascii
      # 转成十六进制字符串后解码为ASCII,再按字节分隔
      hex_str = binascii.hexlify(byte_data).decode('ascii')
      formatted_output = ' '.join(hex_str[i:i+2] for i in range(0, len(hex_str), 2))
      print(formatted_output)
      

    这两种方式都会输出类似01 da 01 01 00 03 04 b0 02 76 00 03...的格式,完全还原每个字节的真实值。

原代码的问题本质

str(f.read(...))会把bytes对象转换成它的字符串表示形式(比如b'\x01\xda\x02v\x00'),其中可打印字符会直接显示为字符,而非转义的十六进制格式,这就是你看到“字节被当作字符读取”的原因。

内容的提问来源于stack exchange,提问作者mjkh10

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:30:03