Python while循环在其他while循环中,无限循环 我想解析一个由数千个块组成的大文件,每个块包含几个子块。为了简单地考虑包含波纹线的输入文件: a 2 3 4 b 3 9 2 c 7

Python while循环在其他while循环中,无限循环 我想解析一个由数千个块组成的大文件,每个块包含几个子块。为了简单地考虑包含波纹线的输入文件: a 2 3 4 b 3 9 2 c 7,python,Python,每一个都在单独的行上。其中字母表定义每个块,数字是块的属性, 我希望输出为字典,块名为键,属性列表为2和3(如果存在),如下所示: {a:[2,3],b:[3,2],c:[]} dict={} with open('sample_basic.txt','r') as file: line=file.readline() line=line.strip() while line: if line.isalpha():

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

{a:[2,3],b:[3,2],c:[]}
 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()
我认为最好的方法是使用两个while循环来阅读和搜索这样的行:

{a:[2,3],b:[3,2],c:[]}
 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))
使用包含您编写的内容的文件的输出是
{'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))

-1,尽管这是一种比OP的方法好得多的方法,但在stackoverflow这里,我们不应该仅仅为其他人提供完整的代码,而是帮助他们修复代码。谢谢您的回答。当然这是一个更好的方法。但是有人能帮我找出我的错误吗。现在我自己的代码也给出了结果{'a':['2']}!。我的代码似乎跳过了一些行,尽管对于每个“while”循环,我认为python应该只执行file.readline()一次!。。。。这个代码有什么问题!?首先,“c\n”.isalpha()由于“\n”而返回False,所以您永远不会将列表放入字典中。您应该执行lev_1=line.strip()或lev_1=line[:-1]从行的末尾删除换行符。之后可以调用str.isalpha()。第二,在第二个循环中,当第2行或第3行时,调用file.readline()两次,这会使循环跳过某些行。@Sziebertham我不理解错误的第二部分,在第二个循环中,我调用了file.readline()两次,但每个都在单独的“if”语句中,因此在第二个“while”循环的每个循环中,只应执行其中一个,为什么不发生呢?为什么python同时执行它们?!执行所有连续的ifs。要用elif替换第二个if的内容。