2011-12-05 21 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を使用します。

さて、私はなど、.dotdir、またdir1という名前の別のディレクトリがあるだろう、dir1に再帰するディレクトリレイアウトを持っている私が何をしたいのか

は、すべて削除階層の最初のレベルを維持する(とは明らかです親ディレクトリ内のファイル/ディレクトリ/それは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

    "あなたがしたいと思う:..." 確かに。どうもありがとうございます!あなたは、私の希望するユースケースが正確に何かをより簡潔に述べました。私はこれを試してみましょう。ありがとう、これは私がうんざりしていた! –

    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)) 
    
    関連する問題