Wie lösche ich den Inhalt eines Ordners in Python?

Wie kann ich den Inhalt eines lokalen Ordners in Python löschen?

Das aktuelle Projekt ist für Windows, aber ich würde gerne auch * nix sehen.

Aktualisiert, um nur Dateien zu löschen und die in den Kommentaren empfohlene Methode os.path.join () zu verwenden. Wenn Sie auch Unterverzeichnisse entfernen möchten, entfernen Sie die Kommentarzeichen für die Elif-statement.

 import os, shutil folder = '/path/to/folder' for the_file in os.listdir(folder): file_path = os.path.join(folder, the_file) try: if os.path.isfile(file_path): os.unlink(file_path) #elif os.path.isdir(file_path): shutil.rmtree(file_path) except Exception as e: print(e) 

Probieren Sie das Shutyl-Modul aus

 import shutil shutil.rmtree('/path/to/folder') 

Beschreibung: shutil.rmtree(path, ignore_errors=False, onerror=None)

Docstring: Löscht rekursiv eine Verzeichnisstruktur.

Wenn ignore_errors gesetzt ist, werden Fehler ignoriert. Andernfalls, wenn ein Fehler gesetzt ist, wird er aufgerufen, um den Fehler mit Argumenten (func, path, exc_info) os.listdir , wobei os.remove os.listdir , os.remove oder os.rmdir ; Pfad ist das Argument für diese function, die das Fehlschlagen verursacht hat; und exc_info ist ein Tupel, das von sys.exc_info() . Wenn ignore_errors false und onerror None , wird eine Ausnahme ignore_errors .

Sie können dies einfach tun:

 import os import glob files = glob.glob('/YOUR/PATH/*') for f in files: os.remove(f) 

Sie können natürlich einen anderen Filter in Ihrem Pfad verwenden, zum Beispiel: /YOU/PATH/*.txt zum Entfernen aller Textdateien in einem Verzeichnis.

Erweitern auf mhawkes Antwort das ist, was ich implementiert habe. Es entfernt den gesamten Inhalt eines Ordners, aber nicht den Ordner selbst. Getestet unter Linux mit Dateien, Ordnern und symbolischen Links, sollte auch unter Windows funktionieren.

 import os import shutil for root, dirs, files in os.walk('/path/to/folder'): for f in files: os.unlink(os.path.join(root, f)) for d in dirs: shutil.rmtree(os.path.join(root, d)) 

Die Verwendung von rmtree und das rmtree des Ordners könnte funktionieren, aber beim Löschen und sofortigen Neuerstellen von Ordnern auf Netzlaufwerken sind mir Fehler rmtree .

Die vorgeschlagene Lösung, die “walk” verwendet, funktioniert nicht, da sie rmtree zum Entfernen von Ordnern verwendet und dann versucht, os.unlink für die Dateien zu verwenden, die sich zuvor in diesen Ordnern befanden. Dies verursacht einen Fehler.

Die Lösung ” glob versucht auch, nicht leere Ordner zu löschen, was zu Fehlern führt.

Ich schlage vor, Sie verwenden:

 folder_path = '/path/to/folder' for file_object in os.listdir(folder_path): file_object_path = os.path.join(folder_path, file_object) if os.path.isfile(file_object_path): os.unlink(file_object_path) else: shutil.rmtree(file_object_path) 

Als oneliner:

 import os # Python 2.7 map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) # Python 3+ list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) ) 

Eine robustere Lösung für Dateien und Verzeichnisse wäre (2.7):

 def rm(f): if os.path.isdir(f): return os.rmdir(f) if os.path.isfile(f): return os.unlink(f) raise TypeError, 'must be either file or directory' map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) 

Anmerkungen: Falls jemand meine Antwort abgelehnt hat, muss ich hier etwas erklären.

  1. Jeder mag kurze und einfache Antworten. Manchmal ist die Realität jedoch nicht so einfach.
  2. Zurück zu meiner Antwort. Ich weiß, dass shutil.rmtree() könnte, um einen Verzeichnisbaum zu löschen. Ich habe es oft in meinen eigenen Projekten verwendet. Aber Sie müssen erkennen, dass das Verzeichnis selbst auch von shutil.rmtree() gelöscht wird . Während dies für einige akzeptabel ist, ist es keine gültige Antwort für das Löschen des Inhalts eines Ordners (ohne Nebenwirkungen) .
  3. Ich werde Ihnen ein Beispiel für die Nebenwirkungen zeigen. Angenommen, Sie haben ein Verzeichnis mit benutzerdefinierten Eigentümer- und Modus-Bits, in denen viele Inhalte enthalten sind. Dann löschen Sie es mit shutil.rmtree() und bauen es mit os.mkdir() . Und Sie erhalten stattdessen ein leeres Verzeichnis mit standardmäßigen (geerbten) Eigentümer- und Modus-Bits. Während Sie möglicherweise das Recht haben, den Inhalt und sogar das Verzeichnis zu löschen, können Sie möglicherweise die ursprünglichen Eigentümer- und Modus-Bits im Verzeichnis nicht zurücksetzen (z. B. wenn Sie kein Superuser sind).
  4. Zuletzt, sei geduldig und lies den Code . Es ist lang und hässlich (in Sicht), aber erwiesen sich als zuverlässig und effizient (im Einsatz).

Hier ist eine lange und hässliche, aber zuverlässige und effiziente Lösung.

Es triggers einige Probleme, die von den anderen Beantwortern nicht angesprochen werden:

  • Es verarbeitet symbolische Links korrekt, einschließlich des Aufrufs von shutil.rmtree() auf einem symbolischen Link (der den Test os.path.isdir() wird, wenn er mit einem Verzeichnis verknüpft ist; selbst das Ergebnis von os.walk() enthält symbolische os.walk() Verzeichnisse auch).
  • Es handhabt nur Lese-Dateien.

Hier ist der Code (die einzige nützliche function ist clear_dir() ):

 import os import stat import shutil # http://stackoverflow.com/questions/1889597/deleting-directory-in-python def _remove_readonly(fn, path_, excinfo): # Handle read-only files and directories if fn is os.rmdir: os.chmod(path_, stat.S_IWRITE) os.rmdir(path_) elif fn is os.remove: os.lchmod(path_, stat.S_IWRITE) os.remove(path_) def force_remove_file_or_symlink(path_): try: os.remove(path_) except OSError: os.lchmod(path_, stat.S_IWRITE) os.remove(path_) # Code from shutil.rmtree() def is_regular_dir(path_): try: mode = os.lstat(path_).st_mode except os.error: mode = 0 return stat.S_ISDIR(mode) def clear_dir(path_): if is_regular_dir(path_): # Given path is a directory, clear its content for name in os.listdir(path_): fullpath = os.path.join(path_, name) if is_regular_dir(fullpath): shutil.rmtree(fullpath, onerror=_remove_readonly) else: force_remove_file_or_symlink(fullpath) else: # Given path is a file or a symlink. # Raise an exception here to avoid accidentally clearing the content # of a symbolic linked directory. raise OSError("Cannot call clear_dir() on a symbolic link") 

Dies ist die einzige Antwort bisher, die:

  • Entfernt alle symbolischen Links
    • tote Links
    • Links zu Verzeichnissen
    • Links zu Dateien
  • entfernt Unterverzeichnisse
  • entfernt das übergeordnete Verzeichnis nicht

Code:

 for filename in os.listdir(dirpath): filepath = os.path.join(dirpath, filename) try: shutil.rmtree(filepath) except OSError: os.remove(filepath) 

Wie bei vielen anderen Antworten versucht dies nicht, Berechtigungen zum Entfernen von Dateien / Verzeichnissen anzupassen.

Du os.walk() besser os.walk() dafür verwenden.

os.listdir() unterscheidet keine Dateien von Verzeichnissen und Sie werden schnell in Schwierigkeiten geraten, wenn Sie versuchen, die os.listdir() . Es gibt ein gutes Beispiel dafür, os.walk() zu verwenden, um hier ein Verzeichnis rekursiv zu entfernen, und Hinweise, wie man es an Ihre Umstände anpassen kann.

 import os import shutil # Gather directory contents contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)] # Iterate and remove each item in the appropriate manner [os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents] 

Ein früherer Kommentar erwähnt auch die Verwendung von os.scandir in Python 3.5+. Beispielsweise:

 import os import shutil with os.scandir(target_dir) as entries: for entry in entries: if entry.is_file() or entry.is_symlink(): os.remove(entry.path) elif entry.is_dir(): shutil.rmtree(entry.path) 

Ich habe das Problem auf diese Weise getriggers:

 import shutil import os shutil.rmtree(dirpath) os.mkdir(dirpath) 

Ich weiß, dass es ein alter Thread ist, aber ich habe etwas interessantes von der offiziellen Seite von Python gefunden. Nur für das Teilen einer anderen Idee zum Entfernen aller Inhalte in einem Verzeichnis. Weil ich bei der Verwendung von shuthil.rmtree () einige Autorisierungsprobleme habe und das Verzeichnis nicht entfernen und neu erstellen möchte. Das Adressoriginal ist http://docs.python.org/2/library/os.html#os.walk . Hoffe das könnte jemandem helfen.

 def emptydir(top): if(top == '/' or top == "\\"): return else: for root, dirs, files in os.walk(top, topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name)) 

Noch eine andere Lösung:

 import sh sh.rm(sh.glob('/path/to/folder/*')) 

Ich habe das Fehlerproblem mit rmtree makedirs getriggers, indem ich time.sleep () zwischen eingefügt habe.

 if os.path.isdir(folder_location): shutil.rmtree(folder_location) time.sleep(.5) os.makedirs(folder_location, 0o777) 

Wenn Sie ein * nix-System verwenden, warum nicht den Systembefehl nutzen?

 import os path = 'folder/to/clean' os.system('rm -rf %s/*' % path) 

Antwort für eine begrenzte, spezifische Situation: Angenommen, Sie möchten die Dateien löschen, während Sie die Unterordner-Struktur beibehalten, können Sie einen rekursiven Algorithmus verwenden:

 import os def recursively_remove_files(f): if os.path.isfile(f): os.unlink(f) elif os.path.isdir(f): map(recursively_remove_files, [os.path.join(f,fi) for fi in os.listdir(f)]) recursively_remove_files(my_directory) 

Vielleicht etwas off-topic, aber ich denke, viele würden es nützlich finden

Dies sollte den Trick nur mit dem OS-Modul zum Auflisten und entfernen Sie dann!

 import os DIR = os.list('Folder') for i in range(len(DIR)): os.remove('Folder'+chr(92)+i) 

Arbeitete für mich, irgendwelche Probleme lassen Sie mich wissen!