您可以将生成器(或通常称为迭代器)视为一次提供一个项目的列表。(不,它不是一个列表)。因此,除非您将它们全部看完,否则您无法计算它会给您多少物品,因为您必须一件一件地拿走它们。(这只是一个基本的想法,现在你应该能够理解文档了,我相信这里也有很多关于它们的问题)。
现在,对于您的情况,您使用了一种不太错误的方法:
count = 0
for filename in files:
count += 1
你做错了什么是采取f
和增加,但f
这里是文件名!递增是没有意义的,也是一个异常。
一旦你有了这些文件名,你必须打开每个单独的文件,阅读它,搜索你的字符串并返回文件名。
def contains(filename, match):
with open(filename, 'r') as f:
for line in f:
if f.find(match) != -1:
return True
return False
match_files = [] for filename in files: if contains(filename, "import sys"): match_file.append(filename) # or a one-liner: match_files = [f for f in files if contains(f, "import sys" )]
现在,作为生成器的示例(在阅读文档之前不要阅读此内容):
def matching(filenames):
for filename in files:
if contains(filename, "import sys"):
# feed the names one by one, you are not storing them in a list
yield filename
# usage:
for f in matching(files):
do_something_with_the_files_that_match_without_storing_them_all_in_a_list()