2

有没有办法使用文件类型检查文件名参数argparse?如果我可以创建正确类型的容器对象,似乎可以通过 type 或 Choices 关键字来完成。

我期待传入的文件类型(例如),如果文件类型不正确( ) file.txt,我想argparse给出它的自动消息.txt。例如, argparse 可能会输出

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

我通常使用 'type' 参数来做这样的检查

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 回答