2016-11-14 5 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))) 

기본적으로, 리눅스 I에서 프로그램을 실행할 때 프로그램의 이름을 입력 한 후 바로 인수를 입력해야합니다. 이 인수는 검색하려는 파일의 이름입니다. 따라서 "./lab7.py .txt"라고 입력하면 프로그램에서 .txt 파일을 반환해야합니다. 나는 아직 초보자이며 대답은 여러분 중 일부에게는 꽤 분명해 보일지 모르겠지만이 프로그램을 실행하는 데 필요한 최종 단계를 얻지 못하는 것 같습니다. 도움이된다면 고맙습니다.

+0

'찾을 수 있습니다. | grep 'txt'' – jmunsch

답변

1

.txt 인수가 이 아닌은 정규 표현식이지만 간단한 확장자이므로, 규칙적인 표현 패키지가 필요하지 않습니다.

내 버전입니다. 확장자 일 수도 있고 파일 이름의 일부일 수도 있기 때문에 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

흥미 롭습니다. 방금 첫 번째 if 문을 스크랩하고 나에게 준 문구로 바꿔야할까요? – DoTNeT

+0

아니요. 방금 내 대답이 재귀 적 사례를 처리하지 않는다는 것을 알았 기 때문에 아니오. –

+0

원래 코드의 비트로 완전히 다시 대답하십시오. 'glob.glob'는 훌륭하지만 재발하지는 않습니다. 여기서는 유용하지 않습니다. –

0

이 대답은 재사용 가능한 유틸리티를 만드는 모듈 기반 접근 방식에 대한 고차원의 스케치를 보여줍니다. 예 : 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_findpython -m 'my_homework.assignment1.list_directories' . | python -m 'my_homework.assignment1.search_a_string' 'txt'

관련 같은 것을 호출과 유사 $PATHmy_grep는 :