2014-01-06 76 views
11

我使用python 3 我試圖寫入二進制文件我使用r + b。Python寫入二進制

for bit in binary: 
    fileout.write(bit) 

其中binary是一個包含數字的列表。 如何將它寫入二進制文件?

最終文件必須看起來像 B」 X07 \ X08 \ X07 \

感謝

+0

什麼是「二進制」在這裏應該是什麼意思?你想要1s和0s? – geoffspear

+0

[在Python中讀寫二進制文件]可能的重複(http://stackoverflow.com/questions/11462466/read-and-write-binary-file-in-python) –

回答

31

當你以二進制方式打開一個文件,那麼你基本上是與bytes類型的工作。因此,當您寫入文件時,您需要傳遞一個bytes對象,並且當您讀取它時,會得到一個bytes對象。相反,在文本模式下打開文件時,您正在使用str對象。

所以,寫作「二元」實在是寫一個字節字符串:

with open(fileName, 'br+') as f: 
    f.write(b'\x07\x08\x07') 

如果你有你想要寫爲二進制的實際整數,則可以使用bytes函數整數序列轉換成bytes對象:

>>> lst = [7, 8, 7] 
>>> bytes(lst) 
b'\x07\x08\x07' 

結合這一點,你可以寫整數作爲一個字節對象的序列爲二進制模式打開的文件。


由於Hyperboreus在評論中指出的,如果你想存儲任意(正)整數的方式bytes將只接受數字0和255之間的序列,實際上適合在一個字節,即數字他們,而不必理會知道他們的確切大小(這是需要的結構),那麼你可以很容易地編寫其中最多分裂這些數字爲單獨字節的輔助函數:

def splitNumber (num): 
    lst = [] 
    while num > 0: 
     lst.append(num & 0xFF) 
     num >>= 8 
    return lst[::-1] 

bytes(splitNumber(123456789)) 
# b'\xabT\xa9\x8c\xeb\x1f\n\xd2' 

所以,如果你有一個列表的數字,你可以輕鬆地遍歷它們並將每個文件寫入文件;如果你想在後面逐個提取數字,你可能需要添加一些東西來跟蹤哪些字節屬於哪個數字。

with open(fileName, 'br+') as f: 
    for number in numbers: 
     f.write(bytes(splitNumber(number))) 
+8

+1但可能提及'open'和'字節'在2.x上表現不同 – wim

+1

@wim OP表示他們正在使用Python 3;現在也將標籤添加到問題中。 (猜猜我們都是同時做到這一點^^) – poke

+0

是的,我只是注意到並在同一瞬間給它添加了標籤!現在我在歷史中進行了一次編輯,實際上沒有任何變化 – wim

13

其中二進制是包含數字的列表

一個號碼都可以有一個千位和一個不同的二進制表示(字節序,寬度,1補碼,2補碼,不同精度的浮點數等)。所以首先你必須決定你想要存儲你的號碼。然後你可以使用struct模塊來做到這一點。

例如,字節序列0x3480可以解釋爲32820(little-endian unsigned short)或-32716(little-endian signed short)或13440(big-endian short)。

小例子:

#! /usr/bin/python3 

import struct 

binary = [1234, 5678, -9012, -3456] 
with open('out.bin', 'wb') as f: 
    for b in binary: 
     f.write(struct.pack('h', b)) #or whatever format you need 

with open('out.bin', 'rb') as f: 
    content = f.read() 
    for b in content: 
     print(b) 
    print(struct.unpack('hhhh', content)) #same format as above 

打印

210 
4 
46 
22 
204 
220 
128 
242 
(1234, 5678, -9012, -3456)