创建一个文件搜索程序,该程序接受带有sys.argv的单个正则表达式。

时间:2016-11-14 20:25:10

标签: python regex glob sys

我需要制作一个完全符合标题的程序。我需要我的程序搜索所有当前文件和所有子目录,以查看是否有任何文件与模式匹配。如果任何文件与模式匹配,则应在屏幕上打印文件的整个路径名。

我已经完成了一些,但是有些部分可能没有意义,因为我复制并粘贴了在课堂上给我的例子中的一些部分:

#!/usr/bin/env python

import re, glob, sys, os
if (len(sys.argv) < 2):
        print("You need an argument.")
        sys.exit(0)

var = sys.argv(1)

#re.search(var,

data = os.walk(".")
for tup in data:
        dirname = tup[0]
        dirlist = tup[1]
        dirlist = tup[2]

        for file in filelist:
                fullname = os.path.join(dirname, file)
                username = owner(fullname)
                if re.data:
                print(os.path.abspath(os.path.join(username, fullname)))

基本上,当我在Linux中运行程序时,我需要输入程序的名称,然后输入一个参数。该参数是我要搜索的文件的名称。所以,如果我输入&#34; ./ lab7.py .txt&#34;我应该期望程序返回任何.txt文件。我仍然是一个初学者,对你们中的一些人来说,答案似乎很明显,但我似乎无法做出最后一步,让这个程序以它应该的方式运行。感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

你的.txt参数不是意味着是一个正则表达式而是一个简单的扩展名,因此你不需要使用regulax表达式包。

这是我的版本。由于它可以是扩展名,也可以是文件名的一部分,因此只需使用in即可。我还简化了owner()部分没有任何意义(除了你的代码很接近)

import os,sys

if (len(sys.argv) < 2):
        print("You need an argument.")
        sys.exit(0)

var = sys.argv[1]

for root,dirs,files in os.walk("."):
    for f in files:
        if var in f:
            fullname = os.path.join(root, f)
            print(os.path.abspath(fullname))

如果扩展名匹配,则打印完整的文件路径。也适用于子目录。

答案 1 :(得分:0)

这个答案显示了基于模块cli的方法的高级草图,用于创建可重用的实用程序。

例如my_find . | my_grep 'txt'

Python setup.py develop vs install

mkdir -p Homework/my_homework
touch Homework/setup.py
touch Homework/my_homework/assignment1.py

virtualenv venv_homework
source venv_homework/bin/activate
python setup.py develop
my_find . | my_grep 'txt'

setup.py:

from setuptools import setup, find_packages


setup(name='my_homework',
      install_requires=[
          # e.g. 'gevent>=0.0.0',
      ],
      entry_points={
          "console_scripts": [
              "my_find=my_homework.assignment1:list_directories",
              "my_grep=my_homework.assignment1:search_a_string",
          ]
      },
      include_package_data=True,
      packages=find_packages(),
      package_data={
           # config files
      },
      zip_safe=False)

作业/ my_homework / assignment1.py:

import fileinput
import argparse
import os, sys

def list_directories():
    # https://stackoverflow.com/questions/2212643/python-recursive-folder-read
   sys.stdout.write('/some/directory/with/a/file.txt\n')
   sys.stdout.write('/some/directory/without/a/file\n') 


def search_a_string():
    '''
        reads from stdout and gets a regex from from sys.argv via argparse
        returns any found regexes back to stdout     
    '''
    # extra credit rewrite ArgumentParser using sys.argv
    argparser = argparse.ArgumentParser()
    argparser.add_argument('my_grep_args', metavar='MY_GREP_ARGS', nargs='*')
    print(my_grep_args)
    for line in fileinput.input():
        # https://stackoverflow.com/questions/19300020/python-match-a-string-with-regex
        sys.stdout.write('regex found {}\n'.format(line))

有一些魔力但是,基本上通过setuptoolspython setup.py develop的setup.py会将函数my_findmy_grep放入$PATH,类似于调用像python -m 'my_homework.assignment1.list_directories' . | python -m 'my_homework.assignment1.search_a_string' 'txt'

这样的东西

相关: