Python在特定目录中搜索文件名模式

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
1个回答

4

我强烈建议查看这个答案。有三种不同的解决方案,但是第一种似乎最准确地匹配了您想要做的事情。

使用Python查找目录中具有.txt扩展名的所有文件

编辑 我刚刚在glob类中发现了更多信息,可能可以完成工作。

来自Python文档

glob.glob(pathname)

返回一个可能为空的路径名列表,这些路径名与pathname匹配,必须是一个包含路径规范的字符串。 pathname可以是绝对路径(如/usr/src/Python-1.5/Makefile)或相对路径(如../../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

)

我实际测试了这个,它在一个我认为符合你要求的目录中工作得非常好。


谢谢。我确实查看了用于文件名模式的内容。我想我在嵌套方面遇到了麻烦,这样我就不必遍历根级别下的所有目录,而是只查找*.ear目录,然后仅在这些目录中查找特定文件。 - adbdkb
哦,很抱歉,我猜那个是在你的问题中。我觉得那可能需要手动完成,在Python中我没有太多遍历文件的经验。也许以后我会给您提供一个新的解决方案,但现在我有点忙于工作。 - Steven
对于在深度为5的遍历中,从'D:\installedApps'目录开始的根目录, dirs和files: 对于dirs中的每个dirname: 如果使用fnmatch.fnmatch(dirname, '*.ear')匹配,则: 打印'dirname:'+ dirname root2 = os.path.normpath(dirname) 对于walk_depth(root2,5)中的root2,dir2和files2: 对于files2中的每个fname: 如果使用fnmatch.fnmatch(fname,'webservices.xml')匹配,则: print '\tfilename : ' + filename - adbdkb
只是想让你知道,我找到了一个解决方案,它符合我对你的问题的理解。 - Steven
感谢您的努力。我的问题是 - 在 ear 目录下,我不知道我的文件可能在哪个级别的子目录中,因此一旦找到 ear 目录,我需要遍历它。这样说通了吗? - adbdkb
1
哦,对不起,我真的以为你只说了一个深度。今天我很难集中注意力 :p。无论如何,这里有一个递归解决方案供您参考。您可以使其更高效/模块化或者其他,我只是希望代码清晰易懂。 - Steven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接