2013-05-29 50 views
2

我有这样的备份目录结构(所有目录不是空的)给定级别的所有子目录:名单在Python

/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): 
    # ???? 

回答

6
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

+2

然后,你需要:'level3_dirs = [X为X在3级,如果os.path.isdir(X)]' – user9876

+0

天才!我爱蟒蛇:) –

3

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

我列入目录的检查为好,以防有可能是与目录混合文件。

0

进口functools,OS

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)], [])