69

私は現在、次のようにargparseを使用しています。

import argparse
from argparse import ArgumentParser

parser = ArgumentParser(description="ikjMatrix multiplication")
parser.add_argument("-i", dest="filename", required=True,
    help="input file with two matrices", metavar="FILE")
args = parser.parse_args()

A, B = read(args.filename)
C = ikjMatrixProduct(A, B)
printMatrix(C)

ここで、の引数は-i読み取り可能なファイルである必要があることに注意してください。どうやってやるの?

を追加しようとしましたがtype=opentype=argparse.FileType('r')機能しましたが、ファイルが有効でない場合は、エラーメッセージが表示されます。どうやってやるの?

4

3 に答える 3

101

実はとても簡単です。ファイルが有効かどうかをチェックし、そうでない場合はエラーを書き込む関数を作成する必要があります。オプションでその関数を使用しtypeます。サブクラス化することで、より凝ったカスタムアクションを作成できることに注意してください。ただし、argparse.Actionここではそれは必要ないと思います。私の例では、開いているファイルハンドルを返します(以下を参照)。

#!/usr/bin/env python

from argparse import ArgumentParser
import os.path


def is_valid_file(parser, arg):
    if not os.path.exists(arg):
        parser.error("The file %s does not exist!" % arg)
    else:
        return open(arg, 'r')  # return an open file handle


parser = ArgumentParser(description="ikjMatrix multiplication")
parser.add_argument("-i", dest="filename", required=True,
                    help="input file with two matrices", metavar="FILE",
                    type=lambda x: is_valid_file(parser, x))
args = parser.parse_args()

A, B = read(args.filename)
C = ikjMatrixProduct(A, B)
printMatrix(C)
于 2012-07-18T12:33:00.327 に答える
52

Python 3.4でこれを行う方法は、argparse.FileTypeクラスを使用することです。終了したら、必ず入力ストリームを閉じてください。'-'これは、STDIN/STDOUTの疑似引数を使用できるので便利です。ドキュメントから:

FileTypeオブジェクトは疑似引数を理解し、これを読み取り可能なオブジェクトと書き込み可能なオブジェクト'-'に自動的に変換しますsys.stdinFileTypesys.stdoutFileType

例:

#!/usr/bin/env python3

import argparse

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--infile', type=argparse.FileType('r', encoding='UTF-8'), 
                      required=True)
  args = parser.parse_args()
  print(args)
  args.infile.close()

そして、実行されたとき...

  • 引数なし:

    $ ./stack_overflow.py
    usage: stack_overflow.py [-h] --infile INFILE
    stack_overflow.py: error: the following arguments are required: --infile
    
  • 存在しないファイルの場合:

    $ ./stack_overflow.py --infile notme
    usage: stack_overflow.py [-h] --infile INFILE
    stack_overflow.py: error: argument --infile: can't open 'notme': [Errno 2] No such file or directory: 'notme'
    
  • 既存のファイルの場合:

    $ ./stack_overflow.py --infile ./stack_overflow.py
    Namespace(infile=<_io.TextIOWrapper name='./stack_overflow.py' mode='r' encoding='UTF-8'>)
    
  • '-'STDINの使用:

    $ echo 'hello' | ./stack_overflow.py --infile -
    Namespace(infile=<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>)
    
于 2016-03-02T01:29:19.313 に答える
19

私はこれを見つけました:

def extant_file(x):
    """
    'Type' for argparse - checks that file exists but does not open.
    """
    if not os.path.exists(x):
        # Argparse uses the ArgumentTypeError to give a rejection message like:
        # error: argument input: x does not exist
        raise argparse.ArgumentTypeError("{0} does not exist".format(x))
    return x

if __name__ == "__main__":
    import argparse, sys, os
    from argparse import ArgumentParser

    parser = ArgumentParser(description="ikjMatrix multiplication")
    parser.add_argument("-i", "--input",
        dest="filename", required=True, type=extant_file,
        help="input file with two matrices", metavar="FILE")
    args = parser.parse_args()

    A, B = read(args.filename)
    C = ikjMatrixProduct(A, B)
    printMatrix(C, args.output)

ソース:fhcrc.github.com

于 2012-07-18T12:34:58.757 に答える