【问题标题】:List all subdirectories on given level列出给定级别的所有子目录
【发布时间】:2013-05-29 09:49:39
【问题描述】:

我有这样的备份目录结构(所有目录都不为空):

/home/backups/mysql/
    2012/
        12/
           15/
    2013/
        04/
           29/
           30/
        05/
           02/
           03/
           04/
           05/

我想通过仅提供根目录路径来获取包含备份的所有目录的列表:

get_all_backup_paths('/home/backups/mysql', level=3) 

这应该返回:

/home/backups/mysql/2012/12/15
/home/backups/mysql/2013/04/29
/home/backups/mysql/2013/04/30
/home/backups/mysql/2013/05/02
/home/backups/mysql/2013/05/03
/home/backups/mysql/2013/05/04
/home/backups/mysql/2013/05/05

那些不应该出现在结果中:

/home/backups/mysql/2012
/home/backups/mysql/2012/12
/home/backups/mysql/2013
/home/backups/mysql/2013/04
/home/backups/mysql/2013/05

有什么办法可以将os.listdir 降低3 级,不包括所有其他级别?如果是的话,我会感谢你的帮助。

def get_all_backup_paths(dir, level):
    # ????

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以使用glob 向下搜索目录树,如下所示:

    import os, glob
    def get_all_backup_paths(dir, level):
       pattern = dir + level * '/*'
       return [d for d in glob.glob(pattern) if os.path.isdir(d)]
    

    我还包括了对目录的检查,以防目录中混有文件。

    【讨论】:

      【解决方案2】:
      from glob import iglob
      
      level3 = iglob('/home/backups/mysql/*/*/*')
      

      (这将跳过名称以. 开头的“隐藏”目录)

      如果第 3 级可能有非目录,请使用以下命令跳过它们:

      from itertools import ifilter
      import os.path
      
      l3_dirs = ifilter(os.path.isdir, level3)
      

      在 Python 3 中,使用 filter 而不是 ifilter

      【讨论】:

      • 那你需要:level3_dirs = [x for x in level3 if os.path.isdir(x)]
      • 目前,filter 是 python 3.8 中的内置函数,因此从 itertools 导入将不起作用,也没有必要。
      【解决方案3】:

      导入功能工具,操作系统

      def deepdirs(directory, depth = 0):
          if depth == 0:
              return list(filter(os.path.isdir, [os.path.join(directory, d) for d in os.listdir(directory)]))
          else:
              return functools.reduce(list.__add__, [deepdirs(d) for d in deepdirs(directory, depth-1)], [])
      

      【讨论】:

        猜你喜欢
        • 2020-08-19
        • 2010-11-17
        • 2010-12-15
        • 1970-01-01
        • 2015-02-24
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 2016-08-07
        相关资源
        最近更新 更多