我試圖編寫一個Python函數,遞歸地刪除所有空目錄。這意味着如果目錄「a」僅包含「b」,則應刪除「b」,則應刪除「a」(因爲它現在不包含任何內容)。如果一個目錄包含任何內容,它將被跳過。圖說:爲什麼python的os.walk()不能反映刪除目錄?
top/a/b/
top/c/d.txt
top/c/foo/
鑑於此,三個目錄「B」,「A」和「富」應該被刪除,因爲「foo」和「B」現在是空的,而「一」將成爲空刪除「b」後。
我試圖通過os.walk
和shutil.rmtree
來做到這一點。不幸的是,我的代碼只是刪除了第一層目錄,而不是在這個過程中新清空的目錄。
我正在使用topdown=false
參數os.walk
。 documentation爲os.walk
表示「如果topdown爲False,則在其所有子目錄的三元組(即自下而上生成的目錄)之後生成目錄的三元組」。這不是我所看到的。
這裏是我的代碼:
for root, dirs, files in os.walk(".", topdown=False):
contents = dirs+files
print root,"contains:",contents
if len(contents) == 0:
print 'Removing "%s"'%root
shutil.rmtree(root)
else:
print 'Not removing "%s". It has:'%root,contents
如果我上面描述的目錄結構,這裏就是我得到:
./c/foo contains: []
Removing "./c/foo"
./c contains: ['foo', 'd.txt']
Not removing "./c". It has: ['foo', 'd.txt']
./a/b contains: []
Removing "./a/b"
./a contains: ['b']
Not removing "./a". It has: ['b']
. contains: ['c', 'a']
Not removing ".". It has: ['c', 'a']
需要注意的是,即使我已經刪除「B」,「一個「不會被刪除,認爲它仍然包含」b「。我感到困惑的是,os.walk
的文檔說它生成「./a」的三元組,在之後生成「b」的三元組。我的輸出表明否則。類似的故事「./c」。它表明它仍然具有「foo」,即使我已經將它刪除了。
我在做什麼錯? (我使用Python 2.6.6。)
我不希望操作系統。步行更新每個迭代的'for'循環 – jcfollower 2015-02-09 20:36:56
我想這是關鍵。文檔中的「之前」和「之後」是指'os.walk()'輸出結果數組中的順序,而不是通過'for'循環連續迭代的時間順序。調用者在'topdown = True'模式下可以修改'dirnames'參數,這讓我認爲迭代可能會受到影響。 – seanahern 2015-02-09 20:55:42