搜索文件直到找到匹配,然后再次搜索直到行尾

时间:2016-01-06 12:47:52

标签: python

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的新手,我正在创建一个非常的脚本 类似的挑战。

2 个答案:

答案 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])则将该值设置为空列表,其中没有。