4

ロードしたファイルの 16 進値を編集する Python スクリプトを作成しようとしていますが、行き詰まりました。Pythonでファイルをバイト単位で16進編集するにはどうすればよいですか??

4

1 に答える 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
于 2012-09-16T07:24:55.093 に答える