web-dev-qa-db-ja.com

argparseの1つの引数に複数のファイルPython 2.7

読み取り可能な複数のファイル名を入力できるargparseで引数を作成しようとしています。この例では、各ファイルオブジェクトを印刷して正しく動作することを確認していますが、エラーを取得する:

error: unrecognized arguments: f2.txt f3.txt

。どうすればそれらすべてを認識させることができますか?

ターミナルでコマンドを実行してプログラムを実行し、複数のファイルを読み取ります

python program.py f1.txt f2.txt f3.txt

Pythonスクリプト

import argparse

def main():
    parser = argparse.ArgumentParser()      
    parser.add_argument('file', nargs='?', type=file)
    args = parser.parse_args()

    for f in args.file:
        print f

if __name__ == '__main__':
    main()

nargs='?' b/cを使用しました。使用可能な任意の数のファイルにする必要があります。 add_argumentを次のように変更した場合:

parser.add_argument('file', nargs=3)

その後、文字列として印刷できますが、「?」で動作させることはできません

22
O.rka

読み取り可能なファイルを1つ以上読み取ることを目標とする場合は、これを試すことができます。

_parser.add_argument('file', type=argparse.FileType('r'), nargs='+')
_

_nargs='+'_は、すべてのコマンドライン引数をリストに収集します。また、1つ以上の引数がある必要があります。そうでない場合、エラーメッセージが生成されます。

type=argparse.FileType('r')は、読み取り用のファイルとして各引数を開こうとします。 argparseがファイルを開けない場合、エラーメッセージが生成されます。これを使用して、引数が有効で読み取り可能なファイルであるかどうかを確認できます。

または、目標がゼロ以上読み取り可能なファイルを読み取ることである場合は、単に_nargs='+'_を_nargs='*'_に置き換えることができます。コマンドライン引数が指定されていない場合、空のリストが表示されます。ファイルを指定していない場合は、stdinを開くこともできます。その場合は、_default=[sys.stdin]_をパラメーターとして_add_argument_に追加します。

そして、リスト内のファイルを処理するには:

_args = parser.parse_args()
for f in args.file:
    for line in f:
        # process file...
_

Nargsの詳細: https://docs.python.org/2/library/argparse.html#nargs

タイプの詳細: https://docs.python.org/2/library/argparse.html#type

47
mcho421

少なくとも1つの引数があることを確認する必要がありました

parser.add_argument('file',nargs='*')
0
O.rka