2015-05-01 226 views
0

我試圖從包含這種格式的二進制數字列表的文件中讀取數據: 0b1111; 0b1010; 0b0101 // 0b1110; 0b0010等等。然後,我想將由「//」分隔的每個部分追加到列表中。每個部分都應該變成一個列表,其中包含由「;」分隔的部分中的所有數字。我終於得到了代碼工作,但在修改了完全不同且不相關的代碼並扭轉了這些變化之後,現在它破裂了。下面是我使用目前,爲試圖解決這個問題,我沒有原始代碼後的代碼:從文件中讀取二進制數

programLoad = open("programs.txt", "r") 
programLoadList = programLoad.read() 
programList = [p for p in programLoadList.split("//")] 
programLoad.close() 

for index in range(len(programList)): 
    programList[index] = [int(n, 2) for n in programList[index].split(";")] 

我不會把這裏的文件,因爲它是非常大的。但是,所有數字都遵循正確的格式,並且在運行時出現錯誤「int base 2的無效文字」的列表理解失敗。

如果您需要更多的信息來幫助,我會很樂意提供。

+4

源代碼管理是一件美妙的事情。 –

+0

從錯誤信息(這似乎缺少n的實際值),看起來像你可能在一行中有兩個分號,即沒有介於中間的0bxxxx數字。 –

+0

您的輸入文件是否包含換行符?如果是這樣的話,你將不得不拆分新行和*'//'* –

回答

1

您可以在一個列表理解這樣做:

In [11]: [[int(b, 2) for b in line.split(";")] for line in program_list.split("//")] 
Out[11]: [[15, 10, 5], [14, 2]] 
+0

我正在使用Python 2.7.8,這可能是我得到的錯誤的原因:語法無效。 – pengowen123

+0

編輯:我懂了!它試圖將空字符串變成二進制數字。該字符串來自文本文件末尾的「//」,這導致它將空的下一行分隔到自己的部分中。感謝您教我關於彼此的理解!另外,你可以在這樣的理解中有if/else語句嗎? [x * 2 for x if [2,3,4,5]中的x> 2] – pengowen123

+0

@ pengowen123是的,但是如果在最後,那麼它是'[x * 2 for [x, 4,5] if x> 2]'。 –

0

我認爲這會工作。只要將每個二進制表示看作一個字符串,並省略前兩個字符並將其餘文本轉換爲整數。

programLoad = open("programs.txt", "r") 
programLoadList = programLoad.read() 
programList = [p for p in programLoadList.split("//")] 
programLoad.close() 

for index in range(len(programList)): 
    print programList[index] 
    programList[index] = [int(n[2:], 2) for n in programList[index].split(";")] 

print programList