abc
123
234
567
acb
d23
678
c34
aad
443
c66
78d
我需要编写一个开始读取文件的循环。一旦它看到以“a”开头的行,它将遍历“a”下面的所有行,直到找到以“a”开头的另一行,并将创建如下的字典:
{ "abc": [123,234,567], "acb": [d23,678,c34], "aad": [443,c66,78d] }
我是python的新手,我正在创建一个非常的脚本 类似的挑战。
答案 0 :(得分:0)
我想我已正确理解你的问题,如果我误解了你,请纠正我 假设您的数据位于名为 t.txt
的文件中import re
f = open("t.txt")
text = f.read()
answer_dict = {}
value_list = []
key = ""
for line in text.split("\n"):
print line
if re.search('^a', line) != None:
value_list = []
key = ""
key = line
else:
value_list.append(line)
answer_dict[key] = value_list
print answer_dict
{'acb': ['d23', '678', 'c34'], 'abc ': ['123', '234', '567'], 'aad': ['443', 'c66', '78d']}
答案 1 :(得分:0)
您可以使用以itertools.groupby
开头的行作为分隔符,使用"a"
分组:
from itertools import groupby
with open("in.txt") as f:
# use itertools.imap for python2
grps = groupby(map(str.rstrip,f), key=lambda x: x[0] == "a")
d = {}
for k,v in grps:
if k:
k = next(v)
d[k] = list(next(grps,["", ""])[1])
print(d)
输出:
{'acb': ['d23', '678', 'c34'], 'aad': ['443', 'c66', '78d'], 'abc': ['123', '234', '567']}
当您找到以a
开头的行时,或使用常规循环开始内循环:
with open("in.txt") as f:
d,f,k = {}, map(str.rstrip, f),None
for line in f:
if line.startswith("a"):
k = line
d[k] = []
for line in f:
if line.startswith("a"):
k = line
d[k] = []
break
d[k].append(line)
elif k:
d[k].append(line)
哪个会输出相同的。我认为应该始终在以a
开头的任何行之后有一个部分,但如果不是list(next(grps,["", ""])[1])
则将该值设置为空列表,其中没有。