【问题标题】:Passing multiple files with asterisk to python shell in Windows在Windows中将带有星号的多个文件传递给python shell
【发布时间】:2012-09-12 04:16:29
【问题描述】:

我正在学习 Google 的 Python 练习,我需要能够从命令行执行此操作:

python babynames.py --summaryfile baby*.html

python 是 Python shell,babynames.py 是 Python 程序,--summaryfile 是我的 babynames 程序要解释的参数,baby*.html 是与该表达式匹配的文件列表。但是,它不起作用,我不确定问题是 Windows 命令 shell 还是 Python。 baby*.html 表达式没有扩展到完整的文件列表,而是严格作为字符串传递。是否可以通过这种方式将多个文件传递给 Python 程序?

【问题讨论】:

    标签: python command-line arguments


    【解决方案1】:

    Windows 的命令解释器在将通配符传递给执行的程序或脚本之前不会像 UNIX shell 那样扩展通配符。

    python.exe -c "import sys; print sys.argv[1:]" *.txt
    

    结果:

    ['*.txt']
    

    解决方案:使用glob 模块。

    from glob import glob
    from sys import argv
    
    for filename in glob(argv[1]):
        print filename
    

    【讨论】:

    • 我是否需要检查包含通配符的参数,然后在这些参数上使用 glob?...或者我可以只在所有参数上使用 glob?
    • 好的,看起来我可以在文件参数上调用 glob,无论它们是否包含通配符。全球性的:)
    • 是的,其中没有任何通配符的文件名是一种与一个文件(或没有)完全匹配的模式。不同之处在于,在这种情况下,您会从glob() 获得一个空列表,而不是稍后发现该文件不存在。这很微妙,但可能会改变您处理错误的方式。
    • 当我使用没有任何通配符的单个文件名时,我根本没有得到一个空列表。效果很好。
    • 我的意思是说,如果用户指定了一个非通配符文件名并且该文件不存在,你会得到一个空列表,就像用户没有指定任何文件。在这种情况下,用户可能会惊讶地收到“没有匹配的文件”消息,而不是“找不到文件”。正如我所说,微妙的......
    【解决方案2】:

    跨平台:

    import glob
    if '*' in sys.argv[-1]:
         sys.argv[-1:] = glob.glob(sys.argv[-1])
    continue...
    

    【讨论】:

    • 也可以是'?'
    • 实际上可以将参数传递给glob而不检查星号,因为没有通配符的路径是有效的glob参数。然后您不需要检查所有选项,但需要花费glob 调用(这大概也是一样的)。
    【解决方案3】:

    使用 argparse:

    import argparse
    parser=argparse.ArgumentParser()
    parser.add_argument(dest='wildcard',nargs='+')
    
    print(parser.parse_args().wildcard)
    

    【讨论】:

    • 嗯.. 我把这段代码放在一个test.py 文件中,并使用python test.py *.json 从Anaconda cmd 提示符调用它(并且同一目录中有.json 文件),我得到了@ 987654326@,这意味着通配符没有扩展到实际文件名。所以,这并不能作为对所述问题的回答。
    • 正确。查看 this Anaconda 的解释和链接。
    【解决方案4】:

    您可以在类似 UNIX 的 shell 中执行此操作,就在您所写的内容中。就我而言,Git Bash 完成了这项工作 - 它接受星号作为输入并正确处理它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-26
      • 2015-12-31
      • 2013-02-02
      • 2018-11-17
      • 2017-10-31
      • 2018-05-20
      • 1970-01-01
      相关资源
      最近更新 更多