當我運行os.walk()
時,我以字母數字順序得到結果;從0開始,結束於z。是否有可能扭轉這種情況?os.walk()反向嗎?
所以,如果我有3個目錄; apple/
,bananas/
,pears/
,我想要pears/
,bananas/
和apples/
返回。
顯然我可以將所有的dirs存儲爲一個列表,然後.reverse()
但這需要很長時間。
當我運行os.walk()
時,我以字母數字順序得到結果;從0開始,結束於z。是否有可能扭轉這種情況?os.walk()反向嗎?
所以,如果我有3個目錄; apple/
,bananas/
,pears/
,我想要pears/
,bananas/
和apples/
返回。
顯然我可以將所有的dirs存儲爲一個列表,然後.reverse()
但這需要很長時間。
首先,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解釋它是如何工作:
當
topdown
是True
,調用者可以修改就地(可能使用del
或切片分配)的dirnames中列表,walk()
只會遞歸到其子目錄名字保留在dirnames
;這可以用來修剪搜索,施加特定的訪問順序,或者甚至在它再次恢復walk()
之前通知walk()
關於呼叫者創建或重命名的目錄。
謝謝。事先閱讀文檔,但沒有意識到這意味着您可以即時重新訂購。 – jdborg 2012-01-30 11:00:13
您不能以任何通用方式反轉發生器。唯一的解決方案是將其轉換爲序列,並以相反的順序遍歷序列。發生器的後期條款只有在計算出較早的條件後才能知道。
以下解決方案使用反轉。如果目錄結構不深,性能應該沒問題。
import os
directory = '/your/dir/'
for root, dirs, files in reversed(list(os.walk(directory))):
print root, dirs, files
你要明白,你實際上可以修改由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!
實際上應該做的伎倆,沒有明顯的額外成本。
你爲什麼要這麼做? – 2012-01-30 10:43:42
,因爲我正在處理一組非常大的以數字順序排列的目錄,我想先看到最高的數字。 – jdborg 2012-01-30 10:45:35