2014-03-14 150 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