2016-11-14 32 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引数はではありません。は正規表現であるが単純な拡張であるため、レギュラマックス表現パッケージは必要ありません。

私のバージョンです。拡張子でもファイル名の一部でもかまいませんので、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は:

関連する問題