Python搜索字符串并打印它所在的文件

时间:2012-02-14 03:36:28

标签: python search file-io

我正在开展一个小型的工作计划,我到处寻求帮助!

我要做的是允许用户输入字符串进行搜索。程序将在定义的目录中搜索字符串中的多个.txt文件,然后打印结果,或使用默认文本编辑器打开.txt文件。

有人可以指出我正确的搜索功能吗?

提前致谢!

编辑: 这就是我到目前为止所拥有的。我不能使用grep,因为这个程序将在Windows和OSX上运行。我还没有在Windows上测试,但在OSX上我的结果是访问被拒绝。

import os
    import subprocess

    text = str(raw_input("Enter the text you want to search for: "))

    thedir = './f'
    for file in os.listdir(thedir):
        document = os.path.join(thedir, file)
        for line in open(document):
            if text in line:
                subpocess.call(document, shell=True)

3 个答案:

答案 0 :(得分:4)

有更好的工具可以做到这一点(提到grep,这可能是最好的方法)。

现在,如果你想要一个Python解决方案(运行速度非常慢),你可以从这里开始:

import os

def find(word):
    def _find(path):
        with open(path, "rb") as fp:
            for n, line in enumerate(fp):
                if word in line:
                    yield n+1, line
    return _find

def search(word, start):
    finder = find(word)
    for root, dirs, files in os.walk(start):
        for f in files:
            path = os.path.join(root, f)
            for line_number, line in finder(path):
                yield path, line_number, line.strip()

if __name__ == "__main__":
    import sys
    if not len(sys.argv) == 3:
        print("usage: word directory")
        sys.exit(1)
    word = sys.argv[1]
    start = sys.argv[2]
    for path, line_number, line in search(word, start):
        print ("{0} matches in line {1}: '{2}'".format(path, line_number, line))

请带上一粒盐:它不会使用正则表达式,或者根本不聪明。例如,如果您尝试搜索“hola”,它将匹配“nicholas”,但不匹配“Hola”(在后一种情况下,您可以添加line.lower()方法。

同样,这只是一个开始向您展示可能的开始方式。但请,请使用grep。

干杯。

示例运行(我将此脚本命名为“pygrep.py”; $是命令提示符):

$python pygrep.py finder .                           
./pygrep.py matches in line 12: 'finder = find(word)'
./pygrep.py matches in line 16: 'for line_number, line in finder(path):'
./pygrep.py~ matches in line 11: 'finder = find(word)'

答案 1 :(得分:2)

下面的

是你答案的提示:)

您可以使用os.walk遍历指定目录结构中的所有文件,搜索文件中的字符串,使用subprocess模块在​​所需的编辑器中打开文件...

答案 2 :(得分:0)

import os
import subprocess

text = str(raw_input("Enter the text you want to search for: "))

thedir = 'C:\\your\\path\\here\\'
for file in os.listdir(thedir):
    filepath = thedir + file
    for line in open(filepath):
        if text in line:
            subprocess.call(filepath, shell=True)
            break