Python如何讀寫位元組資料

2022-10-04 13:48:24 字數 1758 閱讀 4977

問題

你想讀寫二進位制檔案,比如,聲音檔案等等。

解決方案

使用模式為 rb 或 wb 的 open() 函式來讀取或寫入二進位制資料。比如:

# read the entire file as a single byte string

with open('somefile.bin', 'rb') as f:

data = f.read()

# write binary data to a file

with open('somefile.bin', 'wb') as f:

f.write(b'hello world')

在讀取二進位制資料時,需要指明的是所有返回的資料都是位元組字串格式的,而不是文字字串。 類似的,在寫入的時候,必須保證引數是以位元組形式對外暴露資料的物件(比如位元組字串,位元組陣列物件等)。

討論在讀取二進位制資料的時候,位元組字串和文字字串的語義差異可能會導致乙個潛在的陷阱。 特別需要注意的是,索引和迭代動作返回的是位元組的值而不是位元組字串。比如:

>>> # text string

>>> t = 'hello worldwww.cppcns.com'

>>> t[0]

'h'>>> for c in t:

... print(c)

...hel

lo...>>> # byte string

>>> b = b'hello world'

>>> b[0]

72>>> for c in b:

... print(c)

...72

101108

108111

...>>>

如果你想從二進位制模式的檔案中讀取或寫入文字資料,必須確保要進行解碼和編碼操作。比如:

with open('somefile.bin', 'rb') as f:

data = f.read(16)

text = data.decode('utf-8')

with open('somefile.bin', 'wb') as f:

text = 'hello world'

f.write(text.encode('utf-8'))

二進位制i/o還有乙個鮮為人知的特性就是陣列和c結構體型別能直接被寫入,而不需要中間轉換為自己物件。比如:

import array

nums = array.array('i', [1, 2, 3, 4])

with open('data.bin','wb') as f:

f.write(nums)

這個適用於任何實現了被稱之為」緩衝介面」的www.cppcns.com物件,這種物件會直接暴露其底層的記憶體緩衝區給能處理它的操作。 二進位制資料的寫入就是這類操作之一。

很多物件還允許通過使用檔案物件的 readinto() 方法直接讀取二進位制資料到其底層的記憶體中去。比如:

>>> import array

>>> a = array.array('i', [0aeveeborpp, 0, 0, 0, 0, 0, 0, 0])

>>> with open('data.bin', 'rb') as f:

... f.readinto(a)

...16

>>> a

array('i', [1, 2, 3, 4, 0, 0, 0, 0])

>>>

但是使用這種技術的時候需要格外小心,因為它通常具有平台相關性,並且可能會依賴字長和位元組順序(高位優先和低位優先)。

如何獲取每個程序的I 0的讀寫位元組數????

如何獲取每個程序的i 0的讀寫位元組數?delphi windows sdk api 1 程序的i o位元組數用什麼可得到呢?暈。2 98下用getprocesstimes而想得到程序使用率,為何就不行呢?從wmi獲取。想要什麼都有,從軟到硬。呵呵呵呵 wmi是個好東東啊!具體一點。select r...

如何獲取每個程序的I 0的讀寫位元組數????

如何獲取每個程序的i 0的讀寫位元組數?delphi windows sdk api 1 程序的i o位元組數用什麼可得到呢?暈。2 98下用getprocesstimes而想得到程序使用率,為何就不行呢?從wmi獲取。想要什麼都有,從軟到硬。呵呵呵呵 wmi是個好東東啊!具體一點。select r...

資料型別位元組數

一 程式執行平台 不同的平台上對不同資料型別分配的位元組數是不同的。個人對平台的理解是cpu os compiler,是因為 1 64位機器也可以裝32位系統 x64裝xp 2 32位機器上可以有16 32位的編譯器 xp上有tc是16位的,其他常見的是32位的 3 即使是32位的編譯器也可以弄出6...