在Python中递归搜索通配符文件夹

7 投票
3 回答
8534 浏览
提问于 2025-04-16 23:09

你好,我想做一些类似这样的事情:

// 1. for x in glob.glob('/../../nodes/*/views/assets/js/*.js'):
// 2 .for x in glob.glob('/../../nodes/*/views/assets/js/*/*.js'):
    print x

有没有什么办法可以让我递归地搜索呢?

我已经查看了这个链接:在Python中使用Glob()递归查找文件?,但是os.walk不支持像上面那样在节点和视图之间使用通配符文件夹,而且http://docs.python.org/library/glob.html的文档也没有太大帮助。

谢谢!

3 个回答

1

为什么不把你那些带有通配符的路径分成多个部分呢,比如:

parent_path = glob.glob('/../../nodes/*')
for p in parent_path:
    child_paths = glob.glob(os.path.join(p, './views/assets/js/*.js'))
    for c in child_paths:
        #do something

你可以用你想要获取的子资产列表来替换上面的一些内容。

另外,如果你的环境有提供查找命令,那这个命令对这种任务支持得更好。如果你是在Windows系统上,可能也有类似的程序可以使用。

2

我在这里回答过一个类似的问题:使用`**`进行fnmatch和递归路径匹配

你可以使用glob2或者formic,这两个工具都可以通过easy_install或者pip来安装。

GLOB2

FORMIC

你可以在这里找到它们的相关信息: 在Python中使用Glob()递归查找文件?

我经常使用glob2,比如:

import glob2
files = glob2.glob(r'C:\Users\**\iTunes\**\*.mp4')
10

注意: 这段代码会选择根文件夹下的所有符合特定模式的文件,包括子文件夹里的文件。

import os, fnmatch

def locate(pattern, root_path):
    for path, dirs, files in os.walk(os.path.abspath(root_path)):
        for filename in fnmatch.filter(files, pattern):
            yield os.path.join(path, filename)

因为 os.walk 这个函数不支持通配符,所以我们需要遍历整个文件夹树,然后筛选出我们需要的文件。

js_assets = [js for js in locate('*.js', '/../../nodes')]

locate 函数会返回一个迭代器,里面包含所有符合模式的文件。

另一种解决方案: 你可以试试 扩展的 glob,它为 glob 添加了递归搜索的功能。

这样你就可以写出更简单的表达式,比如:

fnmatch.filter( glob.glob('/../../nodes/*/views/assets/js/**/*'), '*.js' )

撰写回答