1

我将编译一个重复出现的字符串列表(事务 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

有人可以建议对第二个代码块进行更正吗?我认识到两次读取文件并不是最优雅的解决方案......我在这里的主要目标是学习如何枚举列表并在后续代码中使用每个值。

4

1 回答 1

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 存储在数据结构中的方法,并且每个 ID 在所述结构中只能出现一次。

如果您想以唯一方式存储您使用的元素,例如字典 ( help(dict)) 或集合 ( help(set))。集合示例:

myset = set()
myset.add(2)  # set([2])
myset.add(3)  # set([2,3])
myset.add(2)  # set([2,3])
于 2013-10-19T02:31:52.130 回答