for循环使用枚举通过带有if语句的列表来搜索特定字符串的行

时间:2013-10-19 02:02:52

标签: python-2.7 if-statement for-loop enumerate

我要编译一个重复字符串列表(事务ID)。 我很沮丧。我研究了正确的方法,感觉这个代码应该有效。 但是,我在第二个区块做错了。 第一个块正确编译了我想要的字符串列表。

我无法让第二块工作。如果我简化,我可以打印列表中的每个值 使用

for idx, val in enumerate(tidarray): print val

似乎我现在应该可以使用该值来搜索该字符串的每一行, 然后打印该行(实际上我将与另一个搜索词一起使用它 减少行读数,但这是我在进一步珩磨之前的基本测试。

def main():
    pass

samlfile= "2013-08-18 06:24:27,410 tid:5af193fdc DEBUG org.sourceid.saml20.domain.AttributeMapping] Source attributes:{SAML_AUTHN_CTX=urn:oasis:names:tc:SAML:2.0:ac:classes"
tidarray = []

for line in samlfile:  

    if "tid:" in line:
        str=line
        tid = re.search(r'(tid:.*?)(?= )', str)
        if tid.group() not in tidarray:
            tidarray.append(tid.group())

for line in samlfile:
    for idx, val in enumerate(tidarray):
        if val in line:
            print line

有人建议修改第二段代码吗?我认识到两次读取文件并不是最优雅的解决方案......我的主要目标是学习如何枚举列表并使用后续代码中的每个值。

1 个答案:

答案 0 :(得分:1)

迭代文件两次

基本上你做的是:

for line in somefile: pass # first run
for line in somefile: pass # second run

第一次运行会很好,第二次运行根本不运行。 这是因为文件被读取直到结束,并且没有更多数据来读取行。 调用somefile.seek(0)转到文件的开头:

for line in somefile: pass # first run
somefile.seek(0)
for line in somefile: pass # second run

独特存储

基本上,您似乎想要的是一种将文件中的ID存储在a中的方法 数据结构和每个id只能在所述结构中一次。

如果要存储唯一的元素,例如,使用词典(help(dict)) 或设置(help(set))。集合示例:

myset = set()
myset.add(2)  # set([2])
myset.add(3)  # set([2,3])
myset.add(2)  # set([2,3])