問題
你想讀寫二進位制檔案,比如,聲音檔案等等。
解決方案
使用模式為 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...