2

を使用してファイル名の引数をファイルタイプチェックする方法はありますargparseか? 適切なタイプのコンテナ オブジェクトを作成できれば、type またはchoices キーワードを使用して実行できるようです。

渡されたファイルの種類 (たとえば、) を期待しており、ファイルの種類が適切でない場合 ( ) に自動メッセージを表示しfile.txtたいと考えています。たとえば、argparse は次のように出力します。argparse.txt

usage: PROG --foo filename etc... error: argument filename must be of type *.txt.

おそらく、間違ったファイルタイプを検出する代わりに、ファイル名の文字列が「.txt」で終わっていないことを検出しようとすることができますが、それには洗練されたコンテナ オブジェクトが必要です。

4

3 に答える 3

5

キーワードを使用してtype=、独自の型コンバーターを指定できます。ファイル名が間違っている場合は、次をスローしArgumentTypeErrorます。

import argparse

def textfile(value):
    if not value.endswith('.txt'):
        raise argparse.ArgumentTypeError(
            'argument filename must be of type *.txt')
    return value

型コンバーターは値を変換する必要はありません。

parser.add_argument('filename', ..., type=textfile)
于 2012-10-19T15:51:26.217 に答える
2

もちろん。カスタム アクションを作成できます。

class FileChecker(argparse.Action):
    def __init__(self,parser,namespace,filename,option_string=None):
        #code here to check the file, e.g...
        check_ok = filename.endswith('.txt')
        if not check_ok:
           parser.error("useful message here")
        else:
           setattr(namespace,self.dest,filename)

そして、それを次のように使用しますaction

parser.add_argument('foo',action=FileChecker)
于 2012-10-19T15:50:40.960 に答える
1

私は通常、「タイプ」引数を使用してそのようなチェックを行います

import argparse

def foo_type(path):
    if not path.endswith(".txt"):
        raise argparse.ArgumentTypeError("Only .txt files allowed")
    return path

parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help', type=foo_type)
args = parser.parse_args()

例:

$ python argp.py --foo not_my_type
usage: argp.py [-h] [--foo FOO]
argp.py: error: argument --foo: Only .txt files allowed
于 2012-10-19T15:57:12.313 に答える