Python 以 'rb' 模式读取二进制文件时,返回的是 bytes 对象,其打印行为会将可打印 ASCII 字节(如 u 显示为 u)自动转义为字符形式,但这不改变实际字节值;只需避免误用 str() 转换,并采用十六进制格式化输出即可准确查看原始字节。
python 以 `'rb'` 模式读取二进制文件时,返回的是 `bytes` 对象,其打印行为会将可打印 ascii 字节(如 `u` 显示为 `u`)自动转义为字符形式,但这**不改变实际字节值**;只需避免误用 `str()` 转换,并采用十六进制格式化输出即可准确查看原始字节。
你遇到的问题并非读取错误,而是对 bytes 对象的显示误解。当你执行 str(f.read(byteAdressEnd)) 时,实际上是将 bytes 对象转为字符串表示(例如 b'Ú...' → "b'\x01\xda...'"),不仅引入了额外的 b'' 和反斜杠转义,还可能因编码推断引发混淆。关键点在于:'rb' 模式本身已确保字节被原样读取——每个 byte 就是 0–255 的整数,绝不会“合并”或“误解析”。
✅ 正确做法是直接操作 bytes 对象,并按需格式化输出。例如:
# ✅ 正确读取:保持 bytes 类型,不调用 str()
with open('tree.sgi', 'rb') as f:
data = f.read(24) # type: bytes
# ✅ 推荐:以十六进制字符串形式清晰展示(每字节两位,空格分隔)
print(data.hex()) # 输出: 01da0101000304b00276000300000000000000ff00000000
# ✅ 或逐字节打印为 xhh 格式(兼容你期望的视觉风格)
def print_bytes_as_hex(data: bytes) -> None:
print(''.join(f'\x{b:02x}' for b in data))
print_bytes_as_hex(data)
# 输出: Ú °v ÿ ⚠️ 注意事项:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 永远不要对 bytes 调用 str()(除非明确需要其调试字符串表示 b'...'),这会破坏原始二进制语义;
- data[i] 直接返回 int(0–255),可安全用于协议解析、校验或位运算;
- 若需写入新二进制文件,直接 f.write(data) 即可,无需任何编码转换;
- hex() 方法和 f'{b:02x}' 是最简洁可靠的十六进制输出方式,比手动切片 hex(b)[1:] 更健壮(避免 0x0 等边界问题)。
总结:Python 的二进制 I/O 本身精准可靠,所谓“字符合并”纯属显示幻觉。聚焦于 bytes 的原生操作,辅以合适的格式化输出,即可高效、无歧义地处理任意二进制数据。
立即学习“Python免费学习笔记(深入)”;

















