2014-12-01 14 views
1

我正在嘗試使用Python讀寫二進制文件。我想教自己一點編程(這不是真的教我自己,因爲我使用互聯網,但無論如何...)。我的問題是,在Python中以二進制讀取文件實際上並沒有將這些位輸出給我,但似乎已經將它處理成文本。Python中的二進制I/O

例子:

我的系統在同一文件夾中的腳本文件「Test.txt的」。

這個文件的內容在下面的文字寫在記事本:

Testing Temp "Testing" 

這是一小片是給我一些混亂的代碼:

f=open("Test.txt", "rb") 
print(f.read(22)) 

這將導致以下輸出:

b'Testing Temp "Testing"' 

但是,我想位字符串的形式(所以一個條ng和0的1)作爲輸出。我怎樣才能做到這一點?

+0

你是什麼意思 「位」?你期望的輸出是什麼? – 2014-12-01 21:14:56

+0

你說得對,我不是很清楚。我正在尋找0和1的字符串。我編輯了我的帖子。 – Dasherman 2014-12-01 21:15:51

+0

你對這個excersize有什麼期待? – 2014-12-01 21:25:32

回答

2

你有什麼是字節的序列(注意b開頭)。 您可以使用索引訪問每個單字節的值。在你的例子中,如果s=f.read(22)然後s[0]將是84這是T的ASCII碼。

如果你想獲得一個字節的二進制表示您使用bin內置:

>>> bin(84) 
'0b1010100' 

它還添加0b前綴這是Python二進制文字前綴:

>>> 0b1010100 
84 

要獲得每比特位的二進制表示,您可以簡單地訪問每個字節並在每個值上調用bin

def to_bits(contents): 
    return ''.join(bin(byte)[2:].zfill(8) for byte in contents) 

導致:

>>> to_bits(b'Testing Temp "Testing"') 
'01010100011001010111001101110100011010010110111001100111001000000101010001100101011011010111000000100000001000100101010001100101011100110111010001101001011011100110011100100010' 

請注意,你必須調用zfill(8)因爲bin可以返回表示超過8位短:

>>> bin(1)[2:] 
'1' 
>>> bin(1)[2:].zfill(8) 
'00000001' 
+0

這是最簡單的方法嗎?這似乎有點過於複雜的方法。沒有內置功能嗎? – Dasherman 2014-12-01 21:20:25

+0

您是否還需要調用'ord(byte)'(至少在2.6中)? ...... @Dasherman其中一行......其實並不那麼複雜 – 2014-12-01 21:23:05

+0

我試過了。 ord(byte)是不需要的,因爲f.read(22)[0]的結果是84,而不是「T」。 – Dasherman 2014-12-01 21:26:18