2011-12-05 69 views
2

我是一個Python新手(到目前爲止,我只是精通bash腳本),並且我有一個關於遞歸和shutil.rmtree的問題。shutil.rmtree在Python中的混合層次級

所以,我有下面的代碼片段...

keepthese = ('dir1', 'dir2', '.dotfile1', '.dotfile2', 'dir3', '.dotdir1') 
dirpath = '/home/' + username + '/parentdir/' 
killthese = [os.path.join('/home', username, '/parentdir', item) for item in os.listdir(dirpath) if item not in keepthese] 
for x in killthese: 
    if os.path.isdir(x): 
     shutil.rmtree(x) 
    else: 
     os.remove(x) 

(是的,我知道這似乎不是很乾淨)。

本質上,我有一組文件名/目錄。對於這個例子,我將使用dir1

現在,我已經在dir1遞歸的目錄結構,也將有一個名爲dir1.dotdir另一個目錄等

我想要做的就是保持層次結構的第一層(顯然每次刪除文件/目錄在parentdir /不匹配keepthese),在keepthese列出的每個目錄中,我想刪除一切(所以我不能做一個基於名字的遞歸,否則我會刪除第一個迭代次數爲keepthese)。

這是否有意義?

+1

我更新了代碼中的縮進。在PEP-8中定義的Python中的標準縮進是4個間隔的軟標籤。 –

+0

謝謝@YuvalAdam!仍然通過PEP8工作。 :X –

回答

1

假設你想:

  • 在給定的根目錄中刪除一切,酒吧除外目錄列表
  • 刪除一切每個除外目錄內

然後像這樣(未經測試!)腳本應該工作:

import sys, os, shutil 

def prune(dirpath, exceptions=()): 
    for name in os.listdir(dirpath): 
     path = os.path.join(dirpath, name) 
     if name in exceptions: 
      prune(path) 
     else: 
      if os.path.isdir(path): 
       shutil.rmtree(path) 
      else: 
       os.remove(path) 

exceptions = ('dir1', 'dir2', '.dotfile1', '.dotfile2', 'dir3', '.dotdir1') 

if __name__ == '__main__': 

    root = os.path.join('/home', sys.argv[1], 'parentdir') 

    prune(root, exceptions) 
+0

「假設您想要:...」 PRECISELY。非常感謝!你用更簡潔的方式說明了我的理想用例是什麼。我會試試這個。謝謝,這讓我陷入了一種r!! –

0

我想嘗試使用os.walk有類似...

for root, dirs, files in os.walk(dirpath, topdown=False): 
    for name in files: 
     os.remove(os.path.join(root, name)) 
    for name in dirs: 
     if name not in keepthese: 
      os.rmdir(os.path.join(root, name))