访问带扩展名的多个文件夹

时间:2013-04-29 14:20:05

标签: python glob

我在这里做点什么,我完全糊涂了。基本上,我在我的目录中有脚本,并且该脚本必须在具有特定扩展名的多个文件夹上运行。现在,我把它放在一个文件夹上运行。这是结构,我有一个主文件夹说,Python,里面我有多个文件夹都使用相同的.ext,并且在每个子文件夹中我再次有几个文件夹,其中我有工作文件。 现在,我希望脚本访问整个路径说,我们在主文件夹'python'里面,我们在其中有folder1.ext->子文件夹1 - >工作文件,再次出来了回去到主文件夹'Python'并开始访问第二个目录。 现在脑子里有很多东西,包括glob模块,os.walk或for循环。我的逻辑错了。我迫切需要一些帮助。

Say,Path = r'\ path1'

我该如何开始?非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

我不确定这是否是您想要的,但这个带有递归辅助函数的主函数会获取主目录中所有文件的字典:

import os, os.path

def getFiles(path):
    '''Gets all of the files in a directory'''
    sub = os.listdir(path)
    paths = {}
    for p in sub:
        print p
            pDir = os.path.join(path, p)
        if os.path.isdir(pDir): 
            paths.update(getAllFiles(pDir, paths))
        else:
            paths[p] = pDir
    return paths

def getAllFiles(mainPath, paths = {}):
    '''Helper function for getFiles(path)'''
    subPaths = os.listdir(mainPath)
    for path in subPaths:
        pathDir = os.path.join(path, p)
        if os.path.isdir(pathDir):
            paths.update(getAllFiles(pathDir, paths))
        else:
                paths[path] = pathDir
    return paths    

这将返回{'my_file.txt': 'C:\User\Example\my_file.txt', ...}形式的字典。

答案 1 :(得分:0)

由于您将第一级目录与其子目录区分开来,您可以执行以下操作:

# this is a generator to get all first level directories
dirs = (d for d in os.listdir(my_path) if os.path.isdir(d)
        and os.path.splitext(d)[-1] == my_ext)

for d in dirs:
    for root, sub_dirs, files in os.walk(d):
        for f in files:
            # call your script on each file f

答案 2 :(得分:0)

您可以使用Formic(披露:我是作者)。 Formic允许您指定一个多目录glob来匹配您的文件,从而消除目录行走:

import formic
fileset = formic.FileSet(include="*.ext/*/working-file", directory=r"path1")

for file_name in fileset:
    # Do something with file_name

需要注意的几点:

  • /*/匹配每个子目录,而/**/递归地下降到每个子目录,子目录等等。一些选择:
    • 如果工作文件恰好是*.ext下方的一个目录,请使用/*/
    • 如果工作文件位于*.ext下的任意深度,请改用/**/
    • 如果工作文件至少一个目录,那么您可以使用/*/**/
  • Formic开始在当前工作目录中搜索。如果这是正确的目录,则可以省略directory=r"path1"
  • 我假设工作文件字面上称为working-file。如果没有,请替换匹配它的glob,例如*.shscript-*