使用通配符搜索文件

时间:2010-07-27 23:20:18

标签: python file wildcard

我想获得一个带有通配符的搜索模式的文件名列表。像:

getFilenames.py c:\PathToFolder\*
getFilenames.py c:\PathToFolder\FileType*.txt
getFilenames.py c:\PathToFolder\FileTypeA.txt

我该怎么做?

5 个答案:

答案 0 :(得分:66)

像这样:

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']

直接来自这里:http://docs.python.org/library/glob.html

答案 1 :(得分:18)

如果你在python中执行此操作,

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+,则可以使用pathlibglob()来代替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:], []))