python argparse,如果省略选项,则搜索特定文件

时间:2013-08-16 13:20:38

标签: python file default argparse optional-arguments

我有输入文件的参数,并且使用argparse

很容易处理它
parser.add_argument( '-al', nargs = 1, type = argparse.FileType( 'r' ),
                     dest = 'alphabet' )

此参数是可选的,但如果省略,我仍然需要通过搜索当前目录来获取此输入文件。如果有多个或没有.al扩展名的文件,我会引发错误,否则打开我找到的文件。

#if no alphabet look for .al file in current directory
if( args.alphabet == None ):
    AlFiles = [ f for f in os.listdir( '.' ) 
                if os.path.isfile( f ) and f.endswith( '.al' ) ]

    #there should be one file with .al extension
    if( len( AlFiles ) != 1 ):
            sys.exit( 'error: no alphabet file provided and '
                    'there are more than one or no .al file in current directory, '
                    'which leads to ambiguity' )

    args.alphabet = open( AlFiles[0], 'r' )

无论如何使用argparse执行此操作,可能使用默认或操作参数。 如果我在解析参数之前进行搜索并且存在异常情况,我仍然无法提出它,因为所需的文件可能由命令行参数提供。我想如果解析器不满足所需的参数就执行动作,但是无法找到如何使用argparse来执行它。

1 个答案:

答案 0 :(得分:0)

您可以通过设置参数的默认属性来解决此问题。

parser = argparse.ArgumentParser()
parser.add_argument('-al',
                    type = argparse.FileType('r'),
                    default = [ f for f in os.listdir( '.' )
                                if os.path.isfile( f ) and f.endswith( '.al' )],
                    dest = 'alphabet' )

然后进行检查。这样你只有一个函数检查是否有多个* .al文件是否省略了参数。

例如,这可以通过以下方式实现:

args =  parser.parse_args()
if isinstance(args.alphabet,types.ListType):
    if len(args.alphabet) != 1:
        parser.error("There must be exactly one alphabet in the directory")
    else:
        args.alphabet = open(args.alphabet[0])

这样args.alphabet将保存一个打开的文件,如果指定了一个字母文件或者当前工作目录中只有一个字母文件,但如果cwd中有更多或没有,则会引发错误。

注意: 因为如果省略-al参数,我们得到一个列表,argparse.FileType('r')将不会打开任何文件。 您还必须省略nargs=1,因为这会创建一个列表,其中包含一个打开的文件,即-al参数中指定的用户。省略此属性将为我们提供原始打开文件,指定用户。

编辑:您必须import types