2016-03-28 13 views
1

Bu soru daha önce sorulmuştur, ancak bulduklarım sayesinde tam olarak istediğimi elde edemiyorum . Bir klasördeki tüm dosyaları ve dizinleri kaldırır ancak üst klasörü kendisi:Python, bir dizindeki dosyaları veya klasörleri yinelemeli olarak kaldırır, ancak üst dizini veya belirli bir klasörü değil

This question kullanıcı amaçlandığı gibi tam işliyor bu kodu verir nerede, bir answer by user Iker sahiptir.

Bunu, üst dizinden değil, üst dizinden tüm dosyaları silerek ve bu dizindeki bir klasörü dışarıda bırakmak istiyorum.

kullanıyorum kodudur:

eğer dosyalar =

tutmak:

import os 
import shutil 

files = '[the path to my folder]' 

for root, dirs, files in os.walk(files): 
    for f in files: 
     os.unlink(os.path.join(root, f)) 
    for d in dirs: 
     shutil.rmtree(os.path.join(root, d)) 

Bir açıklamada "için" sonra ifadesi temelde diyor "Eğer" ekleyerek denedim ve ana dosyadaki "keep" adlı bir klasöre işaret eden bir "keep" değişkenine sahibim; böylece bu betik, ana dizin ve ana öğe içinde "keep" adı verilen dizin dışında kalan her şeyi siler. Ancak, bunu ekledikten sonra kod çalışmaz. İşte

kodu bozulursa ifadesiyle, ben tam kodudur:

import os 
import shutil 

files = '[the path to the parent folder' 
keep = '[the path to the "keep" folder]' 

for root, dirs, files in os.walk(files): 
    for f in files: 
     if files != keep: 
      os.unlink(os.path.join(root, f)) 
    for d in dirs: 
     if files != keep: 
      shutil.rmtree(os.path.join(root, d)) 

ben çok açıktır yapıyorum eminim, ama o kadar, bana açık değildir herhangi bir yardım takdir edilecektir.

Teşekkürler!

DÜZENLEME: Ben'in cevap dayanarak aşağıda, burada benim için çalıştı kodu: Ben eşitlik kontrol etmem

import os 
import shutil 

root_dir = r'[path to directory]' # Directory to scan/delete 

keep = 'keep' # name of file in directory to not be deleted 

for root, dirs, files in os.walk(root_dir): 
    for name in files: 
     # make sure what you want to keep isn't in the full filename 
     if (keep not in root and keep not in name): 
      os.unlink(os.path.join(root, name)) # Deletes files not in 'keep' folder 
    for name in dirs: 
     if (keep not in root and keep not in name): 
      shutil.rmtree(os.path.join(root, name)) # Deletes directories not in 'keep' folder 

cevap

0

ancak yolun olmadığını saklamak istediğiniz klasör içeriyor. keep, bu silmek istediğiniz bazı dosyaları silmek olmayabilir aşağıdadır nasıl ayrıntılı bağlı: Bu örnek

import os 

# change this, obviously 
root_dir = r'C:\Users\ben\Documents\Python Scripts\tmp' 

keep = 'keep' 

for root, dirs, files in os.walk(root_dir): 
    for name in files: 
     # make sure what you want to keep isn't in the full filename 
     if (keep not in root and keep not in name): 
      print(os.path.join(root, name)) #change to os.remove once sure 
    for name in dirs: 
     if (keep not in root and keep not in name): 
      print(os.path.join(root, name)) # change to os.rmdir once sure 

Not (görebilmek için yukarı biraz) docs den uyarlanmıştır rm_me\keep.txt halde tutulacaktır Doğru dizinde değil. Ayrıntılı klasör adları şununla yardımcı olabilir: Eğer r'C:\very_specific' gibi bir şey varsa, bu bir dosyanın adı olmayacak ve ihtiyacınız olan her şeyi sileceksiniz.

+0

Teşekkürler! Bu harika çalıştı. Soruyu, cevabınıza dayalı olarak çalışan kod ile güncelliyorum. – redjax

İlgili konular