5

「リンゴ」のような文字列があります。この文字列を見つけたいのですが、何百ものファイルのうちの 1 つに存在することがわかっています。例えば

file1
file2
file3
file4
file5
file6
...
file200

これらのファイルはすべて同じディレクトリにあります。正確に1つのファイルに含まれていることを知って、Pythonを使用してこの文字列を含むファイルを見つける最良の方法は何ですか.

私はこれを思いついた:

for file in os.listdir(directory):
    f = open(file)
    for line in f:
        if 'apple' in f:
            print "FOUND"
    f.close()

この:

grep = subprocess.Popen(['grep','-m1','apple',directory+'/file*'],stdout=subprocess.PIPE)
found = grep.communicate()[0]
print found
4

5 に答える 5

10

ファイルがすべて同じディレクトリにあるとすれば、現在のディレクトリ リストを取得するだけです。

import os

for fname in os.listdir('.'):    # change directory as needed
    if os.path.isfile(fname):    # make sure it's a file, not a directory entry
        with open(fname) as f:   # open file
            for line in f:       # process line by line
                if 'apples' in line:    # search for string
                    print 'found string in file %s' %fname
                    break

これにより、現在のディレクトリ リストが自動的に取得され、指定されたエントリが (ディレクトリではなく) ファイルであることを確認します。

次に、ファイルを開き、1 行ずつ読み取り (メモリの問題を避けるため、一度にすべてを読み取らないようにします)、各行でターゲット文字列を探します。

ターゲット文字列が見つかると、ファイルの名前が出力されます。

また、ファイルは を使用して開かれるため、with作業が完了すると (または例外が発生すると)、自動的に閉じられます。

于 2012-06-22T19:22:17.710 に答える
2

簡単にするために、これはファイルが現在のディレクトリにあると仮定しています。

def whichFile(query):
    for root,dirs,files in os.walk('.'):
        for file in files:
            with open(file) as f:
                if query in f.read():
                    return file
于 2012-06-22T19:24:54.063 に答える
2
for x in  os.listdir(path):
    with open(x) as f:
        if 'Apple' in f.read():
         #your work
        break
于 2012-06-22T19:24:54.567 に答える
0

遅延評価、itertools ベースのアプローチ

import os
from itertools import repeat, izip, chain

gen = (file for file in os.listdir("."))
gen = (file for file in gen if os.path.isfile(file) and os.access(file, os.R_OK))
gen = (izip(repeat(file), open(file)) for file in gen)
gen = chain.from_iterable(gen)
gen = (file for file, line in gen if "apple" in line)
gen = set(gen)
for file in gen:
  print file
于 2012-06-22T20:26:45.930 に答える