我该如何在Python2中逐字节地进行十六进制编辑文件?

4

我正在尝试编写一个Python脚本,用于编辑我加载的文件的十六进制值,但我卡住了。如何在Python中逐字节地进行十六进制编辑?


1
我会将文件加载到一个字节数组中,你可以直接在其中进行更改。否则,如果文件太大,只需循环遍历一个自定义生成器,该生成器会产生file.read(1)。 - unddoch
查看模块“struct”,如果它符合您的要求。 - rpbear
@pythonm:对于大文件来说,在循环中使用file.read(1)会非常慢。 - nneonneo
1个回答

7
如果文件非常大,并且您只进行覆盖操作(没有插入或删除),则mmap模块允许您将文件视为一个大的可变字符串。这使您可以逐字节编辑文件的内容,或编辑整个片段,而无需将其全部加载到内存中(mmap对象将根据需要惰性地将文件的部分加载到内存中和从内存中读取出来)。
使用起来有点麻烦,但在需要时它非常强大。
例如:
$ xxd data
0000000: a15e a0fb 4455 1d0f b104 1506 0e88 08d6  .^..DU..........
0000010: 8795 d6da 790d aafe 9d6a 2ce5 f7c3 7c97  ....y....j,...|.
0000020: 4999 ab6b c728 352e b1fd 88e0 6acf 4e7d  I..k.(5.....j.N}
$ python
>>> import mmap
>>> f = open('data', 'a+')
>>> m = mmap.mmap(f.fileno(), 0)
>>> m[24:48]
'\x9dj,\xe5\xf7\xc3|\x97I\x99\xabk\xc7(5.\xb1\xfd\x88\xe0j\xcfN}'
>>> m[24:48] = 'a'*24
>>> m.close()
>>> f.close()
>>> ^D
$ xxd data
0000000: a15e a0fb 4455 1d0f b104 1506 0e88 08d6  .^..DU..........
0000010: 8795 d6da 790d aafe 6161 6161 6161 6161  ....y...aaaaaaaa
0000020: 6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接