python glob模块需要argv上的引号

时间:2014-09-09 13:39:04

标签: python glob argv

test.py代码有什么问题?

$ ls *csv
test1.csv test2.csv test3.csv test4.csv
$ python test.py *csv
test1.csv
$ python test.py '*csv'
test1.csv
test2.csv
test3.csv
test4.csv
$ cat test.py 
#!/usr/bin/python

import sys,glob

for filename in glob.glob(sys.argv[1]):
    print filename
$

最终我不想被迫用引号将参数传递给脚本。

编辑:在对已接受的答案发表评论后发现问题

如果shell扩展有效,我不必使用glob,所以循环是:

for filename in sys.argv[1:]:
    print filename

谢谢!

1 个答案:

答案 0 :(得分:3)

这不是glob或Python特有的,它只是通配符在shell中的工作方式。您可以通过将脚本替换为刚刚执行的脚本来查看此内容:

import sys
print sys.argv

在第一个示例中,在脚本运行之前,shell将*.csv扩展为多个文件名。你可以通过打印sys.argv看到这一点 - 所有匹配的文件名都在那里。

如果您不希望shell扩展通配符,则需要使用\引用或转义它们。 (这里有一个例子 - 如果没有匹配的文件,bash会将*.csv传递给你的脚本。默认情况下,zsh会发出错误信号。)

显然,您可以使用以下命令关闭shell中的glob扩展:

set -f

但我认为这不是你想要的。

有关扩展here的大量信息。