使用通配符搜索文件

63 投票
5 回答
105468 浏览
提问于 2025-04-16 01:56

我想要获取一个文件名的列表,这些文件名符合某种搜索模式,并且可以使用通配符。比如:

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

我该怎么做呢?

5 个回答

12

如果你使用的是Python 3.5或更高版本,可以用pathlib里的glob(),而不是单独使用glob模块。

要获取一个文件夹里的所有文件,可以这样写:

from pathlib import Path
for path in Path("/path/to/directory").glob("*"):
    print(path)

或者,如果你只想获取文件夹里所有的.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)
22

glob 在 Python 中很有用,但你的命令行可能没有传递 *(我对 Windows 的命令行不太熟悉)。

举个例子,当我这样做的时候:

import sys
print sys.argv

在我的命令行中,我输入:

$ python test.py *.jpg

我得到的是:

['test.py', 'test.jpg', 'wasp.jpg']

注意到 argv 中并没有 "*.jpg"

这里重要的一点是,大多数命令行会在传递给你的程序之前,先处理掉星号

在这种情况下,要获取文件列表,我只需要用 sys.argv[1:]。另外,你也可以对 * 进行转义,这样 Python 就能看到字面上的 *。然后,你就可以使用 glob 模块了。

$ getFileNames.py "*.jpg"

或者

$ getFileNames.py \*.jpg
102

你可以这样做:

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

注意:如果文件夹里有以 . 开头的文件,默认情况下是不会被匹配到的。例如,假设一个文件夹里有 card.gif.card.gif

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']

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

撰写回答