5

我有一个像'apples'这样的字符串。我想找到这个字符串,我知道它存在于数百个文件中的一个中。例如

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
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

这会自动获取当前目录列表,并检查以确保任何给定条目都是文件(不是目录)。

然后它打开文件并逐行读取(为了避免内存问题,它不会一次全部读取)并在每一行中查找目标字符串。

当它找到目标字符串时,它会打印文件的名称。

此外,由于文件是使用打开的,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

一种惰性评估,基于迭代工具的方法

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 回答
0

打开你的终端并写下这个:

  • 不区分大小写的搜索
grep -i 'apple' /path/to/files
  • 递归搜索(通过所有子文件夹)
grep -r 'apple' /path/to/files
于 2021-12-07T11:54:06.043 回答