2012-01-30 63 views
9

當我運行os.walk()時,我以字母數字順序得到結果;從0開始,結束於z。是否有可能扭轉這種情況?os.walk()反向嗎?

所以,如果我有3個目錄; apple/,bananas/,pears/,我想要pears/,bananas/apples/返回。

顯然我可以將所有的dirs存儲爲一個列表,然後.reverse()但這需要很長時間。

+2

你爲什麼要這麼做? – 2012-01-30 10:43:42

+0

,因爲我正在處理一組非常大的以數字順序排列的目錄,我想先看到最高的數字。 – jdborg 2012-01-30 10:45:35

回答

15

首先,os.walk()不指定在其中返回目錄順序,所以如果我是你,我不會依賴字母順序上。

說了這麼多,你可以選擇其中的子目錄留下topdown設置爲默認值(True),然後排序dirs就地遍歷順序:

import os 
top='/home/aix' 
for root, dirs, files in os.walk(top, topdown=True): 
    print root 
    dirs.sort(reverse=True) 

這會讓os.walk()以其名稱的反向詞典順序遍歷子目錄。

documentation解釋它是如何工作:

topdownTrue,調用者可以修改就地(可能使用del或切片分配)的dirnames中列表,walk()只會遞歸到其子目錄名字保留在dirnames;這可以用來修剪搜索,施加特定的訪問順序,或者甚至在它再次恢復walk()之前通知walk()關於呼叫者創建或重命名的目錄。

+0

謝謝。事先閱讀文檔,但沒有意識到這意味着您可以即時重新訂購。 – jdborg 2012-01-30 11:00:13

1

您不能以任何通用方式反轉發生器。唯一的解決方案是將其轉換爲序列,並以相反的順序遍歷序列。發生器的後期條款只有在計算出較早的條件後才能知道。

以下解決方案使用反轉。如果目錄結構不深,性能應該沒問題。

import os 

directory = '/your/dir/' 
for root, dirs, files in reversed(list(os.walk(directory))): 
    print root, dirs, files 
1

你要明白,你實際上可以修改由os.walk使用的dirs。 (至少除非你明確地設置了topdown=False)。

特別是,您可以例如刪除目錄或使用列表。

import os 
for root, dirs, files in os.walk(startdir): 
    dirs.sort(reverse=True) 
    # Also remove dirs you do not need! 

實際上應該做的伎倆,沒有明顯的額外成本。