2011-07-12 12 views
15

Python3'te os.walk'u alfabetik sırayla dizinleri ziyaret etmeye zorlamanın mümkün olup olmadığını bilmek isterim. Burada piton Yukarıdaki kod dizini vururpython3'ün os.walk'unu alfabetik sırayla dizinleri ziyaret etmeye zorlayabilir miyim? Nasıl?

ryan:~/bktest$ ls -1 sample 
CD01 
CD02 
CD03 
CD04 
CD05 

-------- 

def main_work_subdirs(gl): 
    for root, dirs, files in os.walk(gl['pwd']): 
     if root == gl['pwd']: 
      for d2i in dirs: 
       print(d2i) 

, çıkış edilir:

ryan:~/bktest$ ~/test.py sample 
CD03 
CD01 
CD05 
CD02 
CD04 

Ben yürüyüşe zorlamak istiyorum Örneğin, aşağıda bir dizin ve bu dizinin yol gösterecektir bazı kod Bu direktifleri alfabetik sırada, 01, 02 ... 05 adresinde ziyaret edebilirsiniz. python3 doc for os.walk, bu diyor ki: yukarıdan aşağıya doğru olduğunda

, arayan yerinde ve yürüyüş ((belki del veya dilim ataması kullanarak)) sadece olacak -recurse alt dizinleri içine dirnames listesini değiştirebileceğiniz isimler direk olarak kalır; Bu aramayı budamak için kullanılabilir, ben os.walk üzerinde alfabetik ziyaret düzen empoze anlamına mı geliyor

ziyaret belirli bir düzen empoze? Öyleyse nasıl?

cevap

26

Evet. Dirileri döngüde sıralarsınız.

def main_work_subdirs(gl): 
    for root, dirs, files in os.walk(gl['pwd']): 
     dirs.sort() 
     if root == gl['pwd']: 
      for d2i in dirs: 
       print(d2i) 
+0

, bu oldukça harika. Jeneratörler ile yapabileceğin tek şeyin onları ezberlediğini düşündüm. –

+0

@ryan_m: Bu * yapabileceğiniz her şey *. Ancak, iterasyondaki bir sonraki adım, birincisi ile işiniz bitene kadar oluşturulmadığından, bu tür hilelere izin verir. :-) –

+0

güzel hack! :-) ~ –

0

bildiğim bu zaten yanıtlandı ama bir küçük detay eklemek ve yorumlarda tek bir kod satırında fazlasını ekleyerek sakat istedi.

Dizinlerin sıralanmasını istemenin yanı sıra, "gl" ile yinelemenin tutarlı ve öngörülebilir olması için dosyaların sıralanmasını da istedim. Bunu yapmak için bir tane daha istendi:

for root, dirs, files in os.walk(gl): 
    dirs.sort() 
    for filename in sorted(files): 
    print(os.path.join(root, filename)) 
İlgili konular