python glob模块在argv上需要引号

3 投票
1 回答
1169 浏览
提问于 2025-04-20 16:06

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 个回答

3

这并不是说特定于 glob 或 Python,而是关于通配符在命令行中的工作方式。你可以通过用一个简单的脚本替换你的脚本来看到这一点,那个脚本只做:

import sys
print sys.argv

在第一个例子中,*.csv 会在你的脚本运行之前被命令行自动转换成多个文件名。你可以通过打印 sys.argv 来查看 - 所有匹配的文件名都会在里面。

如果你不想让命令行自动转换通配符,那么你需要用引号把它们包起来,或者用 \ 来转义它们。(这里有一个特殊情况 - 如果没有匹配的文件,bash 会把 *.csv 传给你的脚本,而 zsh 默认会在这种情况下报错。)

显然,你可以通过以下方式在命令行中关闭通配符扩展:

set -f

但我觉得这不是你想要的。

关于扩展的更多信息可以在 这里 找到。

撰写回答