2016-09-28 4 views
0

私は、ユーザーがargparseの引数として単一の文字列または各行に文字列を持つファイル名を提供できるようにしたいというユースケースがあります。argparse:単一の文字列引数を解析する方法または多数の引数をリストしたファイル?

ユーザーを想定が私が探している論理的な流れは、このようなものである./myscript.py -i foobar

を起動します:

スクリプトは、文字列foobarには読めるファイルであるか否かを判断します。 実際に読み込み可能なファイルであれば、スクリプトから関数を呼び出し、foobarの各行をその関数の引数として渡します。 foob​​arが読み込み可能なファイルでない場合は、同じ関数を呼び出しますが、文字列foobarを引数として使用して戻ります。

ファイル名引数に特定の拡張子(または拡張子)が付いていることを保証する能力はありません。

上記のようにロジックを正確にコーディングする以外の方法はありませんか?私はargparse tutorialを見て何も見ませんでしたが、引数としてファイル名にいくつかの具体的なフックがあると考えるのが妥当と思われるので、私は尋ねると思いました。

+0

[os.path.exists](https://docs.python.org/2/library/os.path.html#os.path.exists)を見てみましょう – FamousJameous

答えて

1

の方法は、次のようになります。

のは、あなたがこのようなパーサを作成したとしましょう:

parser.add_argument('-i', 
        help='...', 
        type=function) 

typeポイント、ユーザの入力を評価し、外側の関数になりますfunctionstringfilenameのいずれかを決定します。

typeの詳細については、documentationをご覧ください。ここ

typeのこの使用を示す最小の例である:

parser.add_argument('-d','--directory', 
        type=Val_dir, 
        help='...') 
# .... 

def Val_dir(dir): 
    if not os.path.isdir(dir): 
     raise argparse.ArgumentTypeError('The directory you specified does not seem to exist!') 
    else: 
     return dir 

上記の例はtypeと、我々は時間を解析の入力を制御することができることを示しています。もちろん、あなたの場合、関数は別のロジックを実装します - 入力が文字列かファイル名かを評価します。

0

これは​​のようなものではありません。なぜなら、それは文字列であるからです。その文字列は、ファイル名または関数の引数にすることができます。 parserには同じように見えます。また、通常は機能を実行するために​​は使用されません。これは、コマンドラインを解析するために使用されます。あなたのコードは、その情報で何をすべきかを決定します。

import argparse 
def somefunction(*args): 
    print(args) 

if __name__=='__main__': 
    parser=argparse.ArgumentParser() 
    parser.add_argument('-i','--input') 
    args = parser.parse_args() 

    try: 
     with open(args.input) as f: 
      lines = f.read() 
      somefunction(*lines) 
      # or 
      # for line in lines: 
      # somefuncion(line.strip()) 
    except: 
     somefunction(arg.input) 

​​だけargs.input文字列を提供します。

は、だからここに私はあなたのタスクはないと思うスクリプト(未テスト)です。どのように使用されるかを決定するtry/exceptブロックです。

:これはのようなファイルで動作するようになっている

parser=argparse.ArgumentParser(fromfile_prefix_chars='@', 
    description="use <prog -i @filename> to load values from file") 
parser.add_argument('-i','--inputs') 
args=parser.parse_args() 
for arg in args.inputs: 
    somefunction(arg) 

:ここ================

は接頭チャーアプローチです

one 
two 
three 

https://docs.python.org/3/library/argparse.html#fromfile-prefix-chars

関連する問題