【问题标题】:Visiting multiple folders with extensions访问带有扩展名的多个文件夹
【发布时间】:2013-04-29 14:20:05
【问题描述】:

我正在这里做一些事情,我完全糊涂了。基本上,我的目录中有脚本,并且该脚本必须在具有特定扩展名的多个文件夹上运行。现在,我在一个文件夹上启动并运行它。这是结构,我有一个主文件夹,比如 Python,里面有多个文件夹,所有文件夹都具有相同的 .ext,在每个子文件夹中,我又有几个文件夹,里面有工作文件。 现在,我想让脚本访问整个路径,比如说,我们在主文件夹'python'里面,里面有folder1.ext->sub-folder1->working-file,再次出来回到主文件夹“Python”并开始访问第二个目录。 现在我脑子里有很多东西,glob 模块、os.walk 或 for 循环。我弄错了逻辑。我迫切需要一些帮助。

说,Path=r'\path1'

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

【问题讨论】:

  • 向我们展示您的尝试。
  • 对不起,我没有太多,这就是我所拥有的:Path = os.getcwd() count = 0 os.chdir(Path + "\*.ext1"),我想我需要将 os.chdir 放在一个循环中,以便它继续迭代。有没有其他办法?
  • 另外,您可以使用os.path.split 提取文件扩展名(并只取您想要的扩展名)。

标签: python glob


【解决方案1】:

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

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', ...} 形式的字典。

【讨论】:

    【解决方案2】:

    由于您将第一级目录与其子目录区分开来,您可以这样做:

    # 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
    

    【讨论】:

      【解决方案3】:

      您可以使用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-*

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-06
        • 1970-01-01
        • 1970-01-01
        • 2017-03-17
        • 2021-10-08
        • 2019-07-07
        相关资源
        最近更新 更多