发布于2026-07-04 阅读(0)
扫一扫,手机访问
在Python中处理二进制文件时,经常需要在特定偏移位置修改数据。这看似是个小操作,但用错模式、弄混偏移起点或写入长度不匹配,都会导致写入失败甚至数据错乱。下面梳理一下关键操作要点,希望能帮你避开这些常见的坑。
必须用"r+b"模式打开文件才能在指定偏移量写入二进制数据,它支持读写定位且不转换换行符;seek(1024)定位到索引1024字节(第1025字节),write()为覆盖式写入,data须为bytes类型,长度需与目标区域对齐。

首先,最关键的一步——选对文件打开模式。
只读或纯文本模式(比如"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()就是干这个的。
seek(offset, whence)中whence=0表示从文件开头算起,这是修改指定绝对偏移量的标准做法。用1(当前)或2(末尾)容易误判位置,尤其当文件被多次读写后指针已经移动过。
举个直观的例子:把第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的二进制写入是"覆盖"而非"插入"。想象一下,如果原位置存的是一个4字节整数,你只写入2字节(比如b"\xAA\xBB"),后2字节会保持不变;但如果你写入了6字节,多出来的2字节就会直接覆盖掉后续数据。
安全做法是这样的:
.read(n)读出目标区域原始内容,确认长度bytes替换值(可以用struct.pack()封装数值).write()写入比预期更长的数据,除非你明确想覆盖后面的内容举个例子,修改一个32位小端整数(4字节):
import structwith open("data.bin", "r+b") as f: f.seek(2048) f.write(struct.pack("
处理大文件时,总会有人担心seek()会拖慢速度,或者内存不够用。其实,这个担心是多余的——seek()只是移动文件指针,属于操作系统级别的操作,和文件大小无关。哪怕一个10GB的文件,执行seek(9999999999)也几乎是瞬间完成。
真正需要关注的是:
seek()+write()的支持不够稳定,本地ext4或xfs通常没问题.flush()或正常关闭文件,修改可能还没有落盘(不过with语句会自动处理好这一点)偏移量本身没有上限,只要文件系统支持就行——现代Linux和Windows对单文件偏移的支持远超2^32。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8