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

2022-09-05 01:13:37

这就是我所拥有的:

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'))

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


答案 1

pathlib.Path.rglob

使用 pathlib。Path.rglob 来自 pathlib 模块,该模块是在 Python 3.5 中引入的。

from pathlib import Path

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

如果您不想使用 pathlib,则 use 可以使用 glob.glob('**/*.c'),但不要忘记传入关键字参数,它将在大型目录上使用过多的时间。recursive

对于匹配以点 () 开头的文件的情况;就像当前目录中的文件或基于Unix的系统上的隐藏文件一样,请使用下面的os.walk解决方案。.

os.walk

对于较旧的Python版本,使用os.walk以递归方式遍历目录,并使用fnmatch.filter与简单表达式匹配:

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))

答案 2

对于 python >= 3.5,你可以使用 , :**recursive=True

import glob
for f in glob.glob('/path/**/*.c', recursive=True):
    print(f)

如果递归是 ,该模式将匹配任何文件以及零个或多个目录子目录。如果模式后跟一个 ,则只有目录和匹配项。True**os.sepsubdirectories


Python 3.6 Demo


推荐