3

我如何使用 os.walk (或任何其他方式)以某种方式进行搜索,以便我可以在根目录下具有特定模式的目录下找到具有特定名称的文件

我的意思是,如果我有一个目录 d:\installedApps,在该目录下我有 a.ear、b.ear、... x.ear、y.ear、z.ear 目录以及同一级别的其他目录,我想只在根目录下的*.ear子目录下搜索文件模式web*.xml,而不遍历其他同级目录,我该怎么做?

我尝试了各种方法(一些使用此站点上的其他示例,例如 walklevel 示例等),但没有得到我想要的结果。

更新

我尝试使用此站点的 walkdepth 代码片段并尝试将其组合在嵌套循环中,但这不起作用

这是我试过的代码

import os, os.path
import fnmatch

def walk_depth(root, max_depth):
    print 'root in walk_depth : ' + root
    # some initial setup for getting the depth
    root = os.path.normpath(root)
    depth_offset = root.count(os.sep) - 1

    for root, dirs, files in os.walk(root, topdown=True):
        yield root, dirs, files
        # get current depth to determine if we need to stop
        depth = root.count(os.sep) - depth_offset
        if depth >= max_depth:
            # modify dirs so we don't go any deeper
            dirs[:] = []

for root, dirs, files in walk_depth('D:\installedApps', 5):
    for dirname in dirs:
        if fnmatch.fnmatch(dirname, '*.ear'):
            print 'dirname : ' + dirname
            root2 = os.path.normpath(dirname)
            for root2, dir2, files2 in walk_depth(root2, 5):
                for filename in files2:
                    if fnmatch.fnmatch(filename, 'webservices.xml'):
                        print '\tfilename : ' + filename
4

1 回答 1

4

我强烈建议您查看此答案。有三种不同的解决方案,但#1 似乎最准确地符合您正在尝试做的事情。

在 Python 中查找扩展名为 .txt 的目录中的所有文件

编辑我刚刚发现了一些关于可能完成这项工作的 glob 类的更多信息。

来自 Python 文档

glob.glob(路径名)

返回与路径名匹配的可能为空的路径名列表,该路径名必须是包含路径规范的字符串。路径名可以是绝对的 (like /usr/src/Python-1.5/Makefile) 或相对的 (like ../../Tools/*/*.gif),并且可以包含 shell 样式的通配符。结果中包含损坏的符号链接(如在 shell 中)。

所以你可以按照以下方式做一些事情:

def getFiles(path):
    answer = []
    endPaths = glob.glob(path + "web*.xml")
    answer += endPaths
    if len(glob.glob(path + "*ear/")) > 0:
            answer += getFiles(path + "*ear/")

    return answer

filepaths = getFiles("./")
print(filepaths

)

我实际上测试了那个,它在一个我认为按照你想要的方式设置的目录中工作得很好。

于 2013-12-03T14:53:34.070 回答