【问题标题】:python argparse, search for specific file if option is omittedpython argparse,如果省略选项,则搜索特定文件
【发布时间】:2013-08-18 22:05:16
【问题描述】:

我有一个输入文件的参数,并且很容易用 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 执行操作。

【问题讨论】:

    标签: python file default argparse optional-arguments


    【解决方案1】:

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

    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

    【讨论】:

    • 所以解析后我只是检查args.alphabet 的大小?如果有多个文件,它们都将打开?
    • 据我了解您的问题,您只想打开一个文件,如果它是目录中唯一的 *.al 文件。检查我的编辑以寻求解决方案。
    • 是的,我得到了你的答案,只是在 add_arguments 中,类型是 FileType,这意味着所有文件都是自动打开的 至少你不应该再次重新打开它args.alphabet = open(args.alphabet[0]) 如果有几个文件打开,它们会关闭,如果我们引发错误?
    • 你说得对,我错过了。你到底想用 -al 参数解析什么? .al 文件的名称或包含它的目录?
    • 我只想打开一个文件
    猜你喜欢
    • 2019-04-25
    • 1970-01-01
    • 2019-03-17
    • 2022-01-09
    • 1970-01-01
    • 2021-05-16
    • 2016-12-17
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多