【问题标题】:Passing arguments with wildcards to a Python script将带有通配符的参数传递给 Python 脚本
【发布时间】:2009-01-01 23:08:01
【问题描述】:

我想做这样的事情:

c:\data\> python myscript.py *.csv

并将目录中的所有 .csv 文件传递​​给我的 python 脚本(例如 sys.argv 包含 ["file1.csv", "file2.csv"] 等)

但是sys.argv 只是收到["*.csv"] 表示通配符没有展开,所以这不起作用。

我觉得有一种简单的方法可以做到这一点,但在 Google 上找不到。有什么想法吗?

【问题讨论】:

    标签: python windows command-line arguments


    【解决方案1】:

    您可以使用 glob 模块,这样您就不会依赖于特定 shell 的行为(好吧,您仍然依赖于不扩展参数的 shell,但至少您可以在 Unix 中通过转义通配符:-))。

    from glob import glob
    filelist = glob('*.csv') #You can pass the sys.argv argument
    

    【讨论】:

    • 不是“可以”;对于 Windows,这是“必须的”。
    • 好吧,你也可以使用 os.walk 所以这不是必须的:P
    • @Vinko Vrsalovic:是的。 os.walk 似乎比 glob 更麻烦。 Glob 不是必需的,但它非常适合解决这个问题。
    • 谢谢,正是我想要的。
    • 正是我想要的:)
    【解决方案2】:

    在 Unix 中,shell 扩展通配符,因此程序得到扩展的文件名列表。 Windows 不这样做:shell 将通配符直接传递给程序,程序必须自己扩展它们。

    Vinko 是对的:glob 模块完成了这项工作:

    import glob, sys
    
    for arg in glob.glob(sys.argv[1]):
        print "Arg:", arg
    

    【讨论】:

    • +1。请注意,如果sys.argv[1] 是完全指定的文件名而不是通配符,这也可以正常工作。在这种情况下,glob.glob 只返回一个包含该文件名的列表。
    • 也可以将参数转发到 Python script script.py c:\path\*\subdir glob 会生成一个我以后可以使用的列表。很棒的模块!
    【解决方案3】:

    如果您的脚本是一个实用程序,我建议您在.bashrc 中定义一个这样的函数,以便在目录中调用它:

    myscript() {
       python /path/myscript.py "$@"
    }
    

    然后整个列表被传递给你的python,你可以像这样处理它们:

    for _file in sys.argv[1:]:
        # do something on file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 2016-09-02
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多