我想获得一个带有通配符的搜索模式的文件名列表。像:
getFilenames.py c:\PathToFolder\*
getFilenames.py c:\PathToFolder\FileType*.txt
getFilenames.py c:\PathToFolder\FileTypeA.txt
我该怎么做?
答案 0 :(得分:66)
像这样:
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
答案 1 :(得分:18)
glob
很有用,但是,你的shell可能没有传入*
(我不熟悉windows shell)。
例如,当我执行以下操作时:
import sys
print sys.argv
在我的shell上,我输入:
$ python test.py *.jpg
我明白了:
['test.py', 'test.jpg', 'wasp.jpg']
请注意argv
不包含"*.jpg"
这里重要的一点是,大多数shell会在传递给你的应用程序之前扩展shell 的星号。
在这种情况下,要获取文件列表,我只会sys.argv[1:]
。或者,您可以转义*
,以便python看到文字*
。然后,您可以使用glob
模块。
$ getFileNames.py "*.jpg"
或
$ getFileNames.py \*.jpg
答案 2 :(得分:5)
from glob import glob
import sys
files = glob(sys.argv[1])
答案 3 :(得分:1)
如果您使用的是Python 3.5+,则可以使用pathlib
的glob()
来代替glob
模块。
获取目录中的所有文件如下:
from pathlib import Path
for path in Path("/path/to/directory").glob("*"):
print(path)
或者,要 just 获取目录中所有.txt
文件的列表,您可以这样做:
from pathlib import Path
for path in Path("/path/to/directory").glob("*.txt"):
print(path)
最后,您可以使用通配符目录进行递归搜索(即在目标目录和的所有子目录中找到所有.txt
文件):
from pathlib import Path
for path in Path("/path/to/directory").glob("**/*.txt"):
print(path)
答案 4 :(得分:0)
我将此添加到上一个,因为当您希望脚本使用*
处理多个shell并使用多个参数时,我发现这非常有用。
如果你想要一些适用于每个shell的东西,你可以执行以下操作(仍然使用glob
):
>>> import glob
>>> from functools import reduce # if using python 3+
>>> reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], [])
请注意,它可以生成重复内容(如果您有test
个文件并且您提供了t*
和te*
),但您只需使用set
删除它们即可:
>>> set(reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], []))