我想做类似这样的事情:
c:\data\> python myscript.py *.csv
我希望将目录中所有的.csv文件传递给我的Python脚本(使得sys.argv
包含["file1.csv", "file2.csv"]
等)。
但是sys.argv
只收到["*.csv"]
,表明通配符没有被扩展,因此这样做不起作用。
我觉得有一种简单的方法可以做到这一点,但在Google上找不到。 有什么想法吗?
我想做类似这样的事情:
c:\data\> python myscript.py *.csv
我希望将目录中所有的.csv文件传递给我的Python脚本(使得sys.argv
包含["file1.csv", "file2.csv"]
等)。
但是sys.argv
只收到["*.csv"]
,表明通配符没有被扩展,因此这样做不起作用。
我觉得有一种简单的方法可以做到这一点,但在Google上找不到。 有什么想法吗?
from glob import glob
filelist = glob('*.csv') #You can pass the sys.argv argument
在Unix中,shell会扩展通配符,因此程序会得到已扩展的文件名列表。而Windows不会这样做:shell会将通配符直接传递给程序,程序自己必须进行扩展。
Vinko是正确的:glob模块可以完成这个任务:
import glob, sys
for arg in glob.glob(sys.argv[1]):
print "Arg:", arg
sys.argv[1]
是一个完全指定的文件名而不是通配符,这也可以完美地工作。在这种情况下,glob.glob
会返回一个只包含该文件名的列表。 - Florian Bruckerscript.py c:\path\*\subdir
,glob会生成一个列表,以便稍后使用。这是一个很棒的模块! - Stefatronikpython myscript.py *.csv *.txt
),则glob(sys.argv[1]
可能无法满足需求。您可能需要像下面这样的东西。import sys
from glob import glob
args = [f for l in sys.argv[1:] for f in glob(l)]
即使某些参数中没有通配符,这也可以正常工作。(python abc.txt *.csv anotherfile.dat
)
.bashrc
中定义一个函数来调用它:myscript() {
python /path/myscript.py "$@"
}
然后整个列表将传递到您的Python中,您可以像这样处理它们:
for _file in sys.argv[1:]:
# do something on file