在Python中递归搜索通配符文件夹
你好,我想做一些类似这样的事情:
// 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来安装。
你可以在这里找到它们的相关信息: 在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' )