2010-05-29 19 views
9

"Bilim", "matematik" olarak adlandırılan kategorilerim olan notlarda "notlar" adı verilen bir dizin var ... bu klasör içinde "Quantum Mechanics", "Linear Algebra" gibi alt kategoriler var.Python'da bir dizin ağacı nasıl ayrıştırılır?

./notes 
--> ./notes/maths 
------> ./notes/maths/linear_algebra 
--> ./notes/physics/ 
------> ./notes/physics/quantum_mechanics 

Sorunum İKİ AYRI liste/diziye kategori ve alt kategori koymak nasıl bilmiyorum olmasıdır.

+1

Bunları okumak istediğinizde ne var? iç içe geçmiş bir liste, listeler içeren bir sözlük? –

cevap

13

os.walk'dan yararlanabilirsiniz.

#!/usr/bin/env python 

import os 
for root, dirs, files in os.walk('notes'): 
    print root, dirs, files 

Naif iki seviyeli şaryo:

import os 
from os.path import isdir, join 

def cats_and_subs(root='notes'): 
    """ 
    Collect categories and subcategories. 
    """ 
    categories = filter(lambda d: isdir(join(root, d)), os.listdir(root)) 
    sub_categories = [] 
    for c in categories: 
     sub_categories += filter(lambda d: isdir(join(root, c, d)), 
      os.listdir(join(root, c))) 

    # categories and sub_categories are arrays, 
    # categories would hold stuff like 'science', 'maths' 
    # sub_categories would contain 'Quantum Mechanics', 'Linear Algebra', ... 
    return (categories, sub_categories) 

if __name__ == '__main__': 
    print cats_and_subs(root='/path/to/your/notes') 
1

os.walk bunun için hemen hemen idealdir. Varsayılan olarak yukarıdan aşağıya doğru bir yürüyüş yapar ve bu noktada boş olacak şekilde 'dirnames' ayarları ile 2. seviyede kolayca sonlandırabilirsiniz.

import os 
pth = "/path/to/notes" 
def getCats(pth): 
    cats = [] 
    subcats = [] 
    for (dirpath, dirnames, filenames) in os.walk(pth): 
     #print dirpath+"\n\t", "\n\t".join(dirnames), "\n%d files"%(len(filenames)) 
     if dirpath == pth: 
      cats = dirnames 
     else: 
      subcats.extend(dirnames) 
      dirnames[:]=[] # don't walk any further downwards 
    # subcats = list(set(subcats)) # uncomment this if you want 'subcats' to be unique 
    return (cats, subcats) 
İlgili konular