所以我似乎做了一些令人难以置信的愚蠢的事情,我似乎无法弄明白。我正在尝试创建脚本,搜索文件以查找在另一个文件中定义的术语。这对我来说似乎很基础,但由于某种原因,外部循环迭代在内部循环中是空的。
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
如果我在术语循环之前打印行,它就会有信息。如果我在术语循环中打印行,它就不会。我错过了什么?
答案 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
为'空')。