想直接讀取二進位制資料到乙個可變緩衝區中,而不需要做任何的中間複製操作。或者你想原地修改資料並將它寫回到乙個檔案中去。
為了讀取資料到乙個可變陣列中,使用檔案物件的readinto() 方法。比如
import os.path
defread_into_buffer
(filename)
:buf =
bytearray
(os.path.getsize(filename)
)with
open
(filename,
'rb'
)as f:
f.readinto(buf)
return buf
下面是乙個演示這個函式使用方法的例子:
'''
'''>>
>
with
open
('sample.bin'
,'wb'
)as f:..
. f.write(b'hello world').
..>>
> buf = read_into_buffer(
'sample.bin'
)>>
> buf
bytearray
(b'hello world'
)>>
> buf[0:
5]= b'hallo'
>>
> buf
bytearray
(b'hallo world'
)>>
>
with
open
('newsample.bin'
,'wb'
)as f:..
. f.write(buf)..
.11>>
>
檔案物件的readinto() 方法能被用來為預先分配記憶體的陣列填充資料,甚至包括由array 模組或numpy 庫建立的陣列。和普通read() 方法不同的是, readinto() 填充已存在的緩衝區而不是為新物件重新分配記憶體再返回它們。因此,你可以使用它來避免大量的記憶體分配操作。比如,如果你讀取乙個由相同大小的記錄組成的二進位制檔案時,你可以像下面這樣寫:
'''
'''record_size =
32# size of each record (adjust value)
buf =
bytearray
(record_size)
with
open
('somefile'
,'rb'
)as f:
while
true
:n = f.readinto(buf)
if n < record_size:
break
# use the contents of buf
另外有乙個有趣特性就是memoryview ,它可以通過零複製的方式對已存在的緩衝區執行切片操作,甚至還能修改它的內容。比如:
>>
> buf
bytearray
(b'hello world'
)>>
> m1 =
memoryview
(buf)
>>
> m2 = m1[-5
:]>>
> m2
>
>>
> m2[:]
= b'world'
>>
> buf
bytearray
(b'hello world'
)>>
>
使用f.readinto() 時需要注意的是,你必須檢查它的返回值,也就是實際讀取的位元組數。如果位元組數小於緩衝區大小,表明資料被截斷或者被破壞了(比如你期望每次讀取指定數量的位元組)。最後,留心觀察其他函式庫和模組中和into 相關的函式(比如recv into() ,pack into() 等)。python 的很多其他部分已經能支援直接的i/o 或資料訪問操作,這些操作可被用來填充或修改陣列和緩衝區內容。 php讀取二進位制 php讀取二進位製流
將php資料轉換為二進位制資料 string pack string format mixed args mixed 將二進位制資料轉換為php資料 array unpack string format,string data format a nul padded string a nul 字串填...
Python 二進位制檔案讀取
其實對於檔案單純的讀取還是非常好解決的。只要使用如下語句即可把檔案讀取出到變數temp中 如果對open函式的引數mode不熟悉,可以查閱 此處我們需要以二進位制方式讀取該檔案,因此mode rb with open filename,mode rb as file temp file.read f...
Python 讀取二進位制資料到可變緩衝區中
你想直接讀取二進位制資料到乙個可變緩衝區中,而不需要做任何的中間複製操作。或者你想原地修改資料並將它寫回到乙個檔案中去。為了讀取資料到乙個可變陣列中,使用檔案物件的readinto 方法。比如 import os.path def read into buffer filename buf byte...