Python 讀取二進位制資料到可變緩衝區中

2021-09-28 18:25:56 字數 1891 閱讀 9322

你想直接讀取二進位制資料到乙個可變緩衝區中,而不需要做任何的中間複製操作。 或者你想原地修改資料並將它寫回到乙個檔案中去。

為了讀取資料到乙個可變陣列中,使用檔案物件的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...