迭代变量在嵌套循环中丢失值

时间:2014-05-07 17:37:30

标签: python

所以我似乎做了一些令人难以置信的愚蠢的事情,我似乎无法弄明白。我正在尝试创建脚本,搜索文件以查找在另一个文件中定义的术语。这对我来说似乎很基础,但由于某种原因,外部循环迭代在内部循环中是空的。

if __name__ == "__main__":
    searchfile = open(sys.argv[1],"r")
    terms = open(sys.argv[2],"r")
    for line in searchfile:
        for term in terms:
            if re.match(term, line.rstrip()):
                print line

如果我在术语循环之前打印行,它就会有信息。如果我在术语循环中打印行,它就不会。我错过了什么?

2 个答案:

答案 0 :(得分:2)

这里的问题是文件是耗尽的迭代器 - 这意味着一旦它们被迭代一次,它们将不会从头开始重新启动。

你可能习惯于列表 - 每次从头开始循环时返回一个新迭代器的iterables。

文件是一次性迭代 - 一旦你遍历它们,它们就会耗尽。

您可以使用list()构建可以多次迭代的列表,也可以在循环内打开文件,以便每次重新打开它,从头开始创建一个新的迭代器。

哪种选项最好会因用例而异。打开文件并从磁盘读取会比较慢,但是制作一个列表会要求所有数据保存在内存中 - 如果你的文件非常大,这可能是个问题。

还值得注意的是,在Python中打开文件时应该使用the with statement

with open(sys.argv[1], "r") as searchfile, open(sys.argv[2], "r") as terms:
    terms = list(terms)
    for line in searchfile:
        for term in terms:
            if re.match(term, line.rstrip()):
                print line

答案 1 :(得分:1)

那么你在做什么:在第一次迭代中,你读了searchfile的第一行,并通过阅读文件terms将其与terms中的每一行进行比较。之后,文件terms被完全读取,因此在搜索文件循环的每次下一次迭代中,不再执行术语循环(terms为'空')。