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

Python中open()的r与rb模式处理空字节及f.seek的行为差异解析

文本模式与二进制模式读取空字节的差异解释

你的实验结果差异源于Python中文本模式和二进制模式对文件内容的处理逻辑完全不同,具体解释如下:

1. 两种模式的核心差异

  • 二进制模式(rb):直接以字节为单位读取文件原始内容,不做任何编码/解码操作。文件里的空字节\x00会被原样读取为bytes对象的一部分,所以输出时能看到b'\x00\x00Content',完全符合预期。
  • 文本模式(r):将文件内容视为字符流,会自动用系统默认编码(通常是UTF-8)把字节解码为字符串。此时文件开头的空字节\x00会被解码为Unicode的U+0000空字符——这个字符属于不可打印的控制字符,终端输出时不会渲染出任何可见内容,但它确实存在于读取到的字符串中。

2. 验证空字符的存在

你可以通过以下代码验证文本模式下确实读取到了空字符:

with open("small_file.txt", "r") as f:
    content = f.read()
    print(f"读取到的字符串长度: {len(content)}")  # 输出为9(2个空字符 + 7个"Content"字符)
    for char in content[:2]:
        print(f"空字符的表示: {repr(char)},ASCII码: {ord(char)}")  # 输出'\x00'和0

3. 官方文档的明确规定

Python官方文档对两种模式的行为有清晰定义:

  • 当使用二进制模式(带b标志)时,文件操作围绕bytes对象进行,完全不涉及编码转换,保留文件的原始字节数据。
  • 文本模式下,文件的字节会被解码为字符串,字符串会被编码为字节写入文件;不可打印的控制字符(如U+0000)的显示行为由终端决定,但它们会被正常读取和存储在字符串中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:52:44