使用Glob()在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'))

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


Python 3.5+

从Python版本3.5开始, glob模块支持"**"指令(仅当您传递recursive标志时才会解析该指令):

import glob

for filename in glob.iglob('src/**/*.c', recursive=True):
    print(filename)

如果你需要一个列表,只需使用glob.glob而不是glob.iglob

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

Python 2.2到3.4

对于较早的Python版本,从Python 2.2开始,使用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))

Python 2.1及更早的版本

对于更旧的Python版本, glob.glob针对每个文件名而不是fnmatch.filter使用fnmatch.filter


与其他解决方案类似,但使用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()本身不够好。

链接地址: http://www.djcxy.com/p/20059.html

上一篇: Use a Glob() to find files recursively in Python?

下一篇: Flask Select file from server