以3种不同的方式搜索文件

时间:2009-12-17 23:20:20

标签: python file search

我一直在编写一个以3种不同方式搜索文件的程序。但首先,要在命令行中选择使用哪个搜索程序。

例如,在命令行中输入:

  

程序1搜索:python file.py   'search_term''待搜索文件'

     

程序2搜索:python file.py -z   'number''search_term'   “文件将要搜索的”

     

程序3搜索:python file.py -x   'search_term''待搜索文件'

所有3个搜索脚本都在file.py中。

到目前为止我的编码是:

import re
import sys
#program 1
search_term = sys.argv[1]
f = sys.argv[2]

for line in open(f, 'r'):
    if re.search(search_term, line):
     print line,

# Program 2
flag = sys.argv[1]
num = sys.argv[2]
search_term = sys.argv[3]
f = sys.argv[4]

#program 3
flag = sys.argv[1]
search_term = sys.argv[2]
f = sys.argv[3]

for line in open(f, 'r'):
 if re.match(search_term, line):
  print line,

程序1工作正常没问题。程序2,在文件中找到搜索项,并在'number'参数定义之前和之后打印出一些行,但我不知道如何执行此操作。程序3从搜索项中找到完全匹配,并打印出search_term之后的所有行。 re.match是不合适的,因为它只从字符串的开头搜索它不考虑其余部分。

我的最后一个问题是如何区分三个程序?使用标志或命令行没有标志?

任何帮助都将不胜感激。

由于

2 个答案:

答案 0 :(得分:3)

首先,您应该看看两个非常有用的Python模块:

  • fileinput:迭代过线 来自多个输入流
  • optparse:一个强大的命令 行选项解析器

fileinput将帮助您从多个文件中读取行,甚至可以根据需要进行修改。使用这些工具,您的程序将更容易扩展和阅读

以下是一个例子:

import fileinput
import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option("-z", dest="z", help="Description here")
    parser.add_option("-x", dest="x", help="Description here")
    options, args = parser.parse_args()
    search_term = args[0]
    for line in fileinput.input(args[1:]):
        process(line)

要进行匹配,您可以使用re.search instead of re.match。文档中的一个例子:

>>> re.match("o", "dog")  # No match as "o" is not the first letter of "dog".
>>> re.search("o", "dog") # Match as search() looks everywhere in the string.
<_sre.SRE_Match object at ...>

编辑:回答杰西卡的评论

  

例如在我的文件中说我有   单词:动物园,动物园和动物园。   如果我输入动物园作为我的搜索类型全部3   将被撤回而不仅仅是zo0

您可以将搜索词包装在\ b中以仅匹配单词,例如:

>>> re.search(r'\bzoo\b', 'test zoo')
<_sre.SRE_Match object at 0xb75706e8>
>>> re.search(r'\bzoo\b', 'test zoos')
>>> re.search(r'\bzoo\b', 'test zoological')

\ b匹配一个空字符串,但仅限于单词的开头或结尾。

所以在你的脚本中你可以这样做:

searchterm = r'\b%s\b' % searchterm

注意:这里的r很重要,否则你必须逃避'\'

答案 1 :(得分:1)

对于一个简短的脚本可能有点重,但在pythons标准库中,你会遇到getopt和更方便的optparse模块。

  

getopt 此模块可帮助脚本解析sys.argv中的命令行参数。

     

optparse 是一个比旧的getopt模块更方便,更灵活,更强大的库,用于解析命令行选项。 optparse使用更具说明性的命令行解析方式:创建OptionParser的实例,使用选项填充它,并解析命令行。 optparse允许用户指定传统GNU / POSIX语法中的选项,并为您生成使用和帮助消息。