while循环在其他while循环中,无限循环

时间:2014-03-14 06:39:57

标签: python

我想解析一个巨大的文件,其中包含数千个块,每个块包含几个子块。为了简单起见,请考虑包含波纹线的输入文件:

a
2
3
4
b
3
9
2
c
7

每个单独的行。其中字母表定义每个块,数字是块的属性,  我希望输出作为字典,块名称为键,属性列表只有2和3(如果存在),如下所示:

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

我认为最好的方法是使用两个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()

但它只是通过执行进入无限循环。

我正在寻找错误,但我无法找到它的位置。 我很感激,如果有人能给我一些暗示。

1 个答案:

答案 0 :(得分:0)

我没有仔细检查你的代码,所以我无法帮助你完成无限循环,但是我编写了没有嵌套循环的新代码:

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))

使用包含您撰写内容的文件的输出为{'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))