ジェネレーター(または一般的にはイテレーター)は、一度に1つのアイテムを提供するリストと考えることができます。(いいえ、リストではありません)。ですから、一つ一つ持っていかなければならないので、全部調べないと、どれだけのアイテムがもらえるかは数えられません。(これは単なる基本的な考え方です。これで、ドキュメントを理解できるようになります。ここにも、ドキュメントに関する質問がたくさんあると思います)。
さて、あなたの場合、あなたはそれほど間違っていないアプローチを使用しました:
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 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()