2014-03-14 93 views
0

我想分析由數千塊的一個巨大的文件每一個都包含若干子blocks.for使其易於考慮含波紋線的輸入文件:而其他內循環而循環,無限循環

a 
2 
3 
4 
b 
3 
9 
2 
c 
7 

每個在不同的行。其中字母定義每個塊和數字是該塊的屬性, 我希望輸出作爲字典塊名稱作爲關鍵和屬性列表只有2和3(如果存在)像這樣:

{a:[2,3],b:[3,2],c:[]} 

我認爲是ST的方法是使用兩個while循環讀取和這樣的搜索線:

dict={} 
with open('sample_basic.txt','r') as file: 
    line=file.readline() 
    line=line.strip() 
    while line: 
     if line.isalpha(): 
      block_name=line 
      line=file.readline() 
      line=line.strip() 
      list=[]  
      while line: 
       lev_1=line 
       if lev_1 in ['2','3']: 
        list.append(lev_1) 
        line=file.readline() 
        line=line.strip() 
       if lev_1.isalpha(): 
        dict[block_name]=list 
        break 
       else: 
        line=file.readline() 
        line=line.strip() 

,但它只是由執行進入一個無限循環。

我正在尋找錯誤,但我找不到它在哪裏。 我很感激,如果有人可以給我一些提示。使用文件,你寫的內容

import collections 
d = collections.defaultdict(list) 
with open('sample_basic.txt') as f: 
    for line in f: 
     line = line.strip() 
     if line.isalpha(): 
      blockname=line 
     else: 
      if line in ('2', '3'): 
       d[blockname].append(int(line)) 

輸出:

+0

首先,「C \ n'.isalpha(),因爲的返回False‘\ n’,所以你從來沒有把你的名單到你的字典中。您應該執行lev_1 = line.strip()或lev_1 = line [: - 1]以從行尾刪除換行符。之後你可以調用str.isalpha()。其次,當第二行或第三行使循環跳過某些行時,在第二個循環中調用file.readline()兩次。 – SzieberthAdam

+0

@SzieberthAdam @SzieberthAdam我不明白錯誤的第二部分,在第二個循環中,我調用了file.readline()兩次,但每個都在單獨的'if'語句中,因此每個循環中的第二個'while'循環只是其中的一個執行,爲什麼不發生?爲什麼python執行它們兩個? – user3015703

+0

所有連續的if都被執行。你想用elif替換第二個。 – SzieberthAdam

回答

0

我並沒有嵌套的循環檢查你的代碼過於緊密,所以我不能幫你的無限循環,但我寫新代碼是{'b': [3, 2], 'a': [2, 3]}

如果你想用鑰匙c包含在你的字典空單做

d={} 
with open('sample_basic.txt') as f: 
    for line in f: 
     line = line.strip() 
     if line.isalpha(): 
      blockname=line 
      d[blockname] = [] 
     else: 
      if line in ('2', '3'): 
       d[blockname].append(int(line)) 
+0

-1,儘管這比OP的方法好得多,但在這裏,我們不應該只給出其他人的完整代碼,而是幫助他們修復他們的代碼。 –

+0

+1我不同意。這*是修復代碼。 – tripleee

+0

感謝您的回答。 – user3015703