将带有通配符的参数传递给Python脚本
我想这样做:将带有通配符的参数传递给Python脚本,python,windows,command-line,arguments,Python,Windows,Command Line,Arguments,我想这样做: c:\data\> python myscript.py *.csv 并将目录中的所有.csv文件传递给我的python脚本(例如,sys.argv包含[“file1.csv”、“file2.csv”]等) 但是sys.argv只接收到[“*.csv”]指示通配符未展开,因此这不起作用 我觉得有一个简单的方法可以做到这一点,但在谷歌上找不到。有什么想法吗?您可以使用glob模块,这样您就不会依赖于特定shell的行为(好吧,您仍然依赖于shell而不是扩展参数,但至少可以通
c:\data\> python myscript.py *.csv
并将目录中的所有.csv文件传递给我的python脚本(例如,sys.argv
包含[“file1.csv”、“file2.csv”]
等)
但是sys.argv
只接收到[“*.csv”]
指示通配符未展开,因此这不起作用
我觉得有一个简单的方法可以做到这一点,但在谷歌上找不到。有什么想法吗?您可以使用glob模块,这样您就不会依赖于特定shell的行为(好吧,您仍然依赖于shell而不是扩展参数,但至少可以通过转义通配符:-)在Unix中实现这一点)
在Unix中,shell扩展通配符,因此程序将获得扩展的文件名列表。Windows不这样做:shell将通配符直接传递给程序,程序必须自行展开通配符 Vinko是对的:glob模块完成以下工作:
import glob, sys
for arg in glob.glob(sys.argv[1]):
print "Arg:", arg
如果您的脚本是一个实用程序,我建议您在
.bashrc
中定义这样的函数,以便在目录中调用它:
myscript() {
python /path/myscript.py $@
}
然后将整个列表传递给python,您可以像这样处理它们:
for _file in sys.argv[1:]:
# do something on file
这不是“能”;对于windows,它是“必须”的。嗯,您也可以使用os.walk,因此严格来说它不是必须的:P@Vinko瓦萨洛维奇:是的。walk似乎比glob更麻烦。Glob不是必需的,但它非常适合这个问题。谢谢,正是我想要的。正是我想要的:)+1。请注意,如果
sys.argv[1]
是一个完全指定的文件名而不是通配符,这也可以很好地工作。在这种情况下,glob.glob
只返回一个包含该文件名的列表。如果将一个参数转发到Pythonscript.py c:\path\*\subdir
glob生成一个列表,我以后可以使用该列表,它也会起作用。伟大的模块!
for _file in sys.argv[1:]:
# do something on file