2013-05-29 58 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)], [])