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

2021-09-29 05:22:33 字數 2076 閱讀 6889

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

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