我想解析一个巨大的文件,其中包含数千个块,每个块包含几个子块。为了简单起见,请考虑包含波纹线的输入文件:
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()
但它只是通过执行进入无限循环。
我正在寻找错误,但我无法找到它的位置。 我很感激,如果有人能给我一些暗示。
答案 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))