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 个回答
3
这并不是说特定于 glob
或 Python,而是关于通配符在命令行中的工作方式。你可以通过用一个简单的脚本替换你的脚本来看到这一点,那个脚本只做:
import sys
print sys.argv
在第一个例子中,*.csv
会在你的脚本运行之前被命令行自动转换成多个文件名。你可以通过打印 sys.argv
来查看 - 所有匹配的文件名都会在里面。
如果你不想让命令行自动转换通配符,那么你需要用引号把它们包起来,或者用 \
来转义它们。(这里有一个特殊情况 - 如果没有匹配的文件,bash 会把 *.csv
传给你的脚本,而 zsh 默认会在这种情况下报错。)
显然,你可以通过以下方式在命令行中关闭通配符扩展:
set -f
但我觉得这不是你想要的。
关于扩展的更多信息可以在 这里 找到。