你想直接讀取二進位制資料到乙個可變緩衝區中,而不需要做任何的中間複製操作。 或者你想原地修改資料並將它寫回到乙個檔案中去。
為了讀取資料到乙個可變陣列中,使用檔案物件的readinto()
方法。比如:
import os.path
def read_into_buffer(filename):
buf = bytearray(os.path.getsize(filename))
with open(filename, 'rb') as f:
f.readinto(buf)
return buf
下面是乙個演示這個函式使用方法的例子:
>>> # write a sample file
>>> 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'hello'
>>> buf
bytearray(b'hello 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 defread into buffer filename buf bytear...