2012-06-22 49 views
3

我有一個類似'apples'的字符串。我想找到這個字符串,並且我知道它存在於數百個文件中的一箇中。例如在Python中查找包含所需字符串的文件中的一個文件

file1 
file2 
file3 
file4 
file5 
file6 
... 
file200 

所有這些文件都在同一個目錄中。什麼是最好的方式來找到哪個文件包含這個字符串使用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 
+0

是所有這些文件在同一目錄? – Levon

+0

是的,他們是.. –

回答

8

鑑於文件都在同一個目錄中,我們只得到一個當前目錄列表。

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 

這會自動獲取當前目錄列表,並檢查以確保任何給定條目是文件(不是目錄)。

然後打開文件並逐行讀取它(以避免內存問題它不會一次讀取它)並在每行中查找目標字符串。

當它找到目標字符串時,它會打印文件的名稱。

此外,由於文件是使用with打開的,因此當我們完成(或發生異常)時,它們也會自動關閉。

+0

'os.listdir('。')'返回文件和文件夾。 –

+0

我的解決方案非常相似,只是手動關閉文件。我絕對肯定的是,除了那些文件之外,該文件夾中沒有其他任何東西會在那裏,因爲它們是由另一個程序生成的。你是說這是最快的方法嗎? –

+1

@AshwiniChaudhary是的,這是真的 – Levon

1

爲了簡單起見,這裏假設你的文件在當前目錄:

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 
2
for x in os.listdir(path): 
    with open(x) as f: 
     if 'Apple' in f.read(): 
     #your work 
     break 
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 
相關問題