如何使用glob()递归查找文件?

2024-04-26 11:20:59 发布

您现在位置:Python中文网/ 问答频道 /正文

这就是我所拥有的:

glob(os.path.join('src','*.c'))

但我想搜索src的子文件夹。像这样的方法会奏效:

glob(os.path.join('src','*.c'))
glob(os.path.join('src','*','*.c'))
glob(os.path.join('src','*','*','*.c'))
glob(os.path.join('src','*','*','*','*.c'))

但这显然是有限和笨拙的。


Tags: path方法src文件夹osglobjoin奏效
3条回答

与其他解决方案类似,但使用fnmatch.fnmatch而不是glob,因为os.walk已经列出了文件名:

import os, fnmatch


def find_files(directory, pattern):
    for root, dirs, files in os.walk(directory):
        for basename in files:
            if fnmatch.fnmatch(basename, pattern):
                filename = os.path.join(root, basename)
                yield filename


for filename in find_files('src', '*.c'):
    print 'Found C source:', filename

此外,使用生成器可以按找到的文件处理每个文件,而不是查找所有文件,然后处理它们。

我修改了glob模块以支持**递归全局搜索,例如:

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')

https://github.com/miracle2k/python-glob2/

当您希望为用户提供使用**语法的能力时非常有用,因此单独使用os.walk()还不够好。

Python3.5+

因为您使用的是新的python,所以应该使用^{}模块中的^{}

from pathlib import Path

for filename in Path('src').rglob('*.c'):
    print(filename)

如果不想使用pathlib,只需使用^{},但不要忘记传入recursive关键字参数。

对于以点(.)开头的匹配文件(如当前目录中的文件或基于Unix的系统上的隐藏文件),请使用下面的^{}解决方案。

较旧的Python版本

对于较旧的Python版本,使用^{}递归遍历目录,使用^{}匹配简单表达式:

import fnmatch
import os

matches = []
for root, dirnames, filenames in os.walk('src'):
    for filename in fnmatch.filter(filenames, '*.c'):
        matches.append(os.path.join(root, filename))

相关问题 更多 >