Python 搜索一个文件,直到找到一些匹配项,然后继续搜索,直到行尾

Python 搜索一个文件,直到找到一些匹配项,然后继续搜索,直到行尾,python,Python,我需要写一个循环,开始读取文件。一旦它看到一行以“a”开头,它将遍历“a”下面的所有行,直到找到另一行以“a”开头,并将创建一个字典,如下所示: {“abc:[123234567],“acb:[D23678,c34],“aad:[443,c66,78d]} 我对python非常陌生,我正在创建一个脚本,它具有非常丰富的内容 类似的挑战。我想我已经正确理解了你的问题,如果我误解了你,请纠正我 假设您的数据位于名为t.txt的文件中 abc 123 234 567 acb d23 678 c34

我需要写一个循环,开始读取文件。一旦它看到一行以“a”开头,它将遍历“a”下面的所有行,直到找到另一行以“a”开头,并将创建一个字典,如下所示:

{“abc:[123234567],“acb:[D23678,c34],“aad:[443,c66,78d]}

我对python非常陌生,我正在创建一个脚本,它具有非常丰富的内容
类似的挑战。

我想我已经正确理解了你的问题,如果我误解了你,请纠正我 假设您的数据位于名为t.txt的文件中

abc 
123
234
567
acb
d23
678
c34
aad
443
c66
78d

您可以使用
itertools.groupby
将以
“a”
开头的行作为分隔符拆分为多个组:

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']}
输出:

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)
或者,当您发现一行以
a
开头时,使用常规循环启动内部循环:

{'acb': ['d23', '678', 'c34'], 'aad': ['443', 'c66', '78d'], 'abc': ['123', '234', '567']}

这将输出相同的结果。我假设在任何以
a开始的行之后都应该有一个节,但如果不是
list(next(grps,[“”,”“])[1]),
会将值设置为空的无值列表

让我们看看你的代码——我能给你的诚实回答:你的问题太广泛了,如果不为你编写整个程序,就无法直接回答。因为我们不是免费的代码编写服务,所以我们不会这么做。在python中实现这一点并不困难,但您至少需要能够对python编程一点。进入python.org,学习基本教程。嗨,Marcus,谢谢,可能这看起来像是一个家庭作业,但不是,我是一名系统管理员,想用python实现一些脚本,我问的问题只是一个问题的开始,我还有很长的路要走,但是如果我能得到一些开始的帮助,那么我应该能够了解我自己。嗨,Prashant,非常感谢你的代码,我几乎完成了我的脚本,我将在这里分享最后的脚本,但是你能帮我一个请求吗?如果我想通过提供值来找到密钥,我该怎么做?例如,如果要通过提供值234来搜索字典,我将如何获得键“abc”基本上,我希望答案中k,v的值“123”
:print k,v if str(v)=“123”:print“They Key is:”打印k其他:打印“未找到密钥”
输出:-acb['d23','678','c34']未找到密钥abc['123','234','567']未找到密钥aad['443','c66','78d','']找不到键在答案中为k,v尝试此标志=1。\u dict.iteritems():打印k,如果str(v)=“123”:print“他们的键是:”print k flag=0如果flag:print“No key Found”这里如果flag:print“No key Found”在“for loop”之外我正在尝试下面的代码,但是它没有给出钥匙。谢谢你的帮助,谢谢你的两种技巧,你能告诉我,地图有什么用吗?我认为它的用途相当广泛lot@FAlam,它将一个函数映射到你传递给它的任何一个iterable上,在这种情况下,我们去掉所有的换行符,在循环中的每一行调用
line.rstrip()
,位映射实际上更快
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)