2016-11-14 1 views
2

Мне нужно сделать программу, которая точно соответствует заголовку. Мне нужна моя программа для поиска по всем текущим файлам и всем вспомогательным каталогам, чтобы увидеть, соответствуют ли какие-либо файлы шаблону. Если какие-либо файлы соответствуют шаблону, весь путь к файлу должен быть напечатан на экране.Сделать программу поиска файлов, которая принимает одно регулярное выражение с помощью sys.argv.

У меня есть некоторые из этого завершена, однако некоторые части не имеет смысла, так как я скопировать и вставить некоторые части из примеров, приведенных ко мне в классе:

#!/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 I необходимо ввести имя программы, а затем аргумент сразу. Этот аргумент - это имя файла, который я хочу найти. Поэтому, если я набрал «./lab7.py .txt», я должен ожидать, что программа вернет любые .txt-файлы. Я все еще новичок, и ответ может показаться довольно очевидным для некоторых из вас, но я просто не могу получить этот последний шаг, необходимый для того, чтобы эта программа работала так, как должна. Любая помощь приветствуется, спасибо.

+0

'найти. | grep 'txt'' – jmunsch

ответ

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

Если расширение совпадает, полный путь_к_файлу печатается. Также работает в подкаталогах.

+0

Интересно. Должен ли я просто отказаться от моего первого заявления и заменить его тем, что вы мне дали? – DoTNeT

+0

нет, так как я только понял, что мой ответ не обрабатывает рекурсивный случай. –

+0

ответ полностью переписан с битами исходного кода. 'glob.glob' хорош, но не рекурсивно. Не полезно здесь. –

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

Существует какая-то магия, но, в основном setup.py через setuptools или python setup.py develop разместит функции my_find и my_grep в $PATH аналогично вызову что-то вроде python -m 'my_homework.assignment1.list_directories' . | python -m 'my_homework.assignment1.search_a_string' 'txt'

Связанный:

Смежные вопросы