Löschen von Ordnerinhalten in Python

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

Das aktuelle Projekt ist für Windows, aber ich möchte auch nix sehen.

    16 Solutions collect form web for “Löschen von Ordnerinhalten in Python”

    Aktualisiert, um nur Dateien zu löschen und die os.path.join () -Methode zu verwenden, die in den Kommentaren vorgeschlagen wurde. Wenn Sie auch Unterverzeichnisse entfernen möchten, entfernen Sie die elif-Anweisung.

     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) 

    Versuche das Shutil-Modul

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

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

    Docstring: Rekursiv einen Verzeichnisbaum löschen.

    Wenn ignore_errors gesetzt ist, werden Fehler ignoriert; Andernfalls wird, wenn onerror gesetzt ist, es aufgerufen, 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 Funktion, die es verursacht hat, zu scheitern; Und exc_info ist ein Tupel, das von sys.exc_info() . Wenn ignore_errors falsch ist und onerror None , wird eine Ausnahme ignore_errors .

    Sie können das einfach tun:

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

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

    Auf die Antwort von mhawke ist das, was ich implementiert habe. Es entfernt alle Inhalte eines Ordners, aber nicht den Ordner selbst. Geprüft auf 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)) 

    Mit rmtree und neu rmtree der Ordner könnte funktionieren, aber ich habe Fehler beim Löschen und sofort neu erstellen Ordner auf Netzwerk-Laufwerke.

    Die vorgeschlagene Lösung mit Spaziergang funktioniert nicht, da sie rmtree , um Ordner zu entfernen, und dann kann versuchen, os.unlink auf die Dateien zu verwenden, die zuvor in diesen Ordnern waren. Dies führt zu einem Fehler.

    Die gepostete glob Lösung wird auch versuchen, nicht leere Ordner zu löschen und Fehler zu verursachen.

    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 auch (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)) ) 

    Vielleicht bist du besser mit os.walk() dafür.

    os.listdir() unterscheidet keine Dateien von Verzeichnissen und du wirst schnell in Schwierigkeiten geraten, diese zu verknüpfen. Es gibt ein gutes Beispiel für die Verwendung von os.walk() um rekursiv ein Verzeichnis hier zu entfernen und Hinweise darauf, wie man es an Ihre Umstände anpasst.

    Anmerkungen: Falls jemand unten meine Antwort abgestimmt hat, habe ich hier etwas zu erklären.

    1. Jeder mag kurze 'n' einfache Antworten. Doch manchmal ist die Realität 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 schon oft in meinen eigenen Projekten benutzt. Aber du musst erkennen, dass das Verzeichnis selbst auch von shutil.rmtree() gelöscht wird . Während dies für einige akzeptabel sein könnte, ist es keine gültige Antwort zum Löschen des Inhalts eines Ordners (ohne Nebenwirkungen) .
    3. Ich zeige Ihnen ein Beispiel für die Nebenwirkungen. Angenommen, Sie haben ein Verzeichnis mit benutzerdefinierten Besitzer und Modus Bits, wo gibt es eine Menge von Inhalten. Dann shutil.rmtree() du es mit shutil.rmtree() und baue es mit os.mkdir() . Und du bekommst stattdessen ein leeres Verzeichnis mit standardmäßigen (geerbten) Besitzer- und Modusbits. Während Sie das Privileg haben, den Inhalt und sogar das Verzeichnis zu löschen, können Sie nicht in der Lage sein, den ursprünglichen Besitzer und die Modusbits im Verzeichnis zurückzusetzen (zB kein Superuser).
    4. Schließlich sei geduldig und lese den Code . Es ist lang und hässlich (in Sicht), aber erwies sich als zuverlässig und effizient (im Einsatz).

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

    Es löst einige Probleme auf, die von den anderen Beantwortlichen nicht angesprochen werden:

    • Es behandelt korrekt symbolische Links, auch nicht rufen shutil.rmtree() auf einem symbolischen Link (die übergeben wird die os.path.isdir() Test, wenn es Links zu einem Verzeichnis, auch das Ergebnis von os.walk() enthält symbolisch verknüpft Verzeichnisse auch).
    • Es behandelt schreibgeschützte Dateien schön.

    Hier ist der Code (die einzige nützliche Funktion 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") 

    Ich konw es ist ein alter Thread, aber ich habe etwas Interessantes von der offiziellen Seite von Python gefunden. Nur für die gemeinsame Nutzung einer anderen Idee zum Entfernen aller Inhalte in einem Verzeichnis. Denn ich habe einige Probleme der Autorisierung bei der Verwendung von shutil.rmtree () und ich möchte nicht das Verzeichnis zu entfernen und neu zu erstellen. Die Adresse Original 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 Lösung:

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

    Dies ist die einzige Antwort so weit, die:

    • Entfernt alle symbolischen Links
      • Tote Verbindungen
      • 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 viele andere Antworten, das versucht nicht, Berechtigungen anzupassen, um das Entfernen von Dateien / Verzeichnissen zu ermöglichen.

     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 gelöst:

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

    Ich löste das Fehlerproblem mit rmtree makedirs durch das Hinzufügen von time.sleep () zwischen.

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

    Antwort für eine begrenzte, spezifische Situation: Angenommen, du möchtest die Dateien löschen, während du den Unterordnerbaum beibehältest, kannst du 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 der Trick nur mit dem OS-Modul zu listen und dann entfernen!

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

    Für mich gearbeitet, irgendwelche Probleme lassen Sie mich wissen!

    Python ist die beste Programmiersprache der Welt.