必须用"r+b"模式打开文件才能在指定偏移量写入二进制数据,它支持读写定位且不转换换行符;seek(1024)定位到索引1024字节(第1025字节),write()为覆盖式写入,data须为bytes类型,长度需与目标区域对齐。

用 open() 以 "r+b" 模式打开文件才能写入偏移量位置
只读或纯文本模式("r"、"w")无法在任意位置写入二进制数据。"r+b" 是关键:它允许读取+写入+定位,且不触发换行符转换或编码重解释。
常见错误是用 "w+b" —— 它会清空原文件;或者用 "rb" 后调 .write() 报错 io.UnsupportedOperation: write。
实操建议:
- 务必先确认文件存在且有写权限,否则
OSError: [Errno 13] Permission denied - 打开后立即用
.seek(offset)定位,再调.write(data),不要依赖当前指针位置 - 写入的
data必须是bytes类型(如b"\x00\x01"),传str会报TypeError: a bytes-like object is required
seek() 的 whence 参数决定偏移起点,多数情况用 0
seek(offset, whence) 中 whence=0 表示从文件开头算起,这是修改指定绝对偏移量的标准做法。用 1(当前)或 2(末尾)容易误判位置,尤其当文件被多次读写后指针已移动。
立即学习“Python免费学习笔记(深入)”;
示例:把第 1024 字节(即 offset=1024)改成 0xFF
with open("data.bin", "r+b") as f:
f.seek(1024)
f.write(b"\xFF")
注意:seek(1024) 不等于“跳过前 1024 字节”,而是“定位到索引为 1024 的字节”(即第 1025 个字节,因索引从 0 开始)。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
写入长度必须与原始数据对齐,否则会覆盖后续内容
Python 的二进制写入是“覆盖”而非“插入”。如果原位置存的是 4 字节整数,你只写入 2 字节(如 b"\xAA\xBB"),后 2 字节保持不变;若写入 6 字节,则多出的 2 字节会覆盖紧邻的后续数据。
安全做法:
- 先用
.read(n)读出目标区域原始内容,确认长度 - 构造等长的
bytes替换值(可用struct.pack()封装数值) - 避免用
.write()写入比预期更长的数据,除非明确想覆盖
例如修改一个 32 位小端整数(4 字节):
import struct
with open("data.bin", "r+b") as f:
f.seek(2048)
f.write(struct.pack("<I", 0xDEADBEEF)) # 确保正好 4 字节
大文件慎用 seek() + write(),但无需加载全量到内存
有人担心 seek() 会读完整个文件 —— 不会。seek() 只是移动文件指针,操作系统级操作,与文件大小无关。哪怕 10GB 文件,seek(9999999999) 也几乎瞬时完成。
真正要注意的是:
- 频繁随机写入小块数据时,磁盘 I/O 可能成为瓶颈,但这是硬件限制,不是 Python 问题
- 某些网络文件系统(如 NFS)对
seek()+write()支持不稳定,本地 ext4/xfs 通常没问题 - 没调
.flush()或没正常关闭文件,修改可能未落盘(不过with语句会自动处理)
偏移量本身没有上限,只要文件系统支持(现代 Linux/Windows 对单文件偏移支持远超 2^32)。

















