2012-09-16 91 views
4

我想製作一個python腳本,它將編輯我加載的文件的十六進制值,並且卡住了。我怎樣才能十六進制編輯一個文件在Python中逐字節?我怎樣才能在python2中逐字節編輯文件?

+1

我將文件加載到一個字節數組,其可以就地改變。否則,如果文件太大,只需循環一個生成file.read(1)的定製生成器即可。 – lolopop

+0

看到模塊結構如果它想要你想 – cheneydeng

+0

@pythonm:'file.read(1)'在一個循環中對於一個大文件來說真的很慢。 – nneonneo

回答

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