it-swarm.com.de

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 auch gerne * nix sehen.

330
UnkwnTech

Aktualisiert, um nur Dateien zu löschen und die in den Kommentaren vorgeschlagene Methode os.path.join () zu verwenden. Wenn Sie auch Unterverzeichnisse entfernen möchten, deaktivieren 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)
312
Nick Stinemates

Probieren Sie das Shutil-Modul aus

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

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

Docstring: Einen Verzeichnisbaum rekursiv löschen.

Wenn ignore_errors eingestellt ist, werden Fehler ignoriert. Andernfalls, wenn onerror gesetzt ist, wird es aufgerufen, um den Fehler mit Argumenten (func, path, exc_info) zu behandeln, wobei funcos.listdir, os.remove oder os.rmdir ist. ; path ist das Argument für die Funktion, die zum Fehlschlagen geführt hat. und exc_info ist ein Tupel, das von sys.exc_info() zurückgegeben wird. Wenn ignore_errors falsch ist und onerrorNone ist, wird eine Ausnahme ausgelöst.

Wichtiger Hinweis: Beachten Sie, dass shutil.rmtree() nicht nur den Inhalt des Zielordners löscht. Es löscht auch den Ordner selbst.

210
Oli

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, um alle Textdateien in einem Verzeichnis zu entfernen.

173
Blueicefield

Ich habe auf die Antwort von mhawke eingegangen. Es entfernt den gesamten Inhalt eines Ordners, nicht jedoch den Ordner selbst. Unter Linux mit Dateien, Ordnern und symbolischen Links getestet, 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))
68
Iker Jimenez

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

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

Die veröffentlichte glob-Lösung versucht auch, nicht leere Ordner zu löschen, wodurch Fehler verursacht werden.

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)
44
jgoeders

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 die Abrechnung von Dateien und Verzeichnissen 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)) )
15
fmonegaglia

Notes: Falls jemand meine Antwort abgelehnt hat, habe ich hier etwas zu erklären.

  1. Jeder mag kurze einfache Antworten. Manchmal ist die Realität jedoch nicht so einfach.
  2. Zurück zu meiner Antwort Ich weiß, dass shutil.rmtree() zum Löschen eines Verzeichnisbaums verwendet werden kann. Ich habe es oft in meinen eigenen Projekten verwendet. Sie müssen jedoch wissen, dass das Verzeichnis selbst auch von shutil.rmtree()gelöscht wird. Dies mag zwar für einige akzeptabel sein, ist aber keine gültige Antwort zum Löschen des Inhalts eines Ordners (ohne Nebeneffekte) .
  3. Ich zeige Ihnen ein Beispiel für die Nebenwirkungen. Angenommen, Sie haben ein Verzeichnis mit customizedowner- und mode-Bits, in dem sehr viel Inhalt vorhanden ist. Dann löschen Sie es mit shutil.rmtree() und bauen es mit os.mkdir() neu auf. Sie erhalten stattdessen ein leeres Verzeichnis mit default (vererbten) Eigentümer- und Modusbits. Während Sie möglicherweise das Recht haben, den Inhalt und sogar das Verzeichnis zu löschen, können Sie möglicherweise nicht die ursprünglichen Eigentümer- und Modusbits im Verzeichnis zurücksetzen (z. B. sind Sie kein Superuser).
  4. Zum Schluss sei geduldig und lese den Code . Es ist lang und hässlich (in Sichtweite), aber erwiesenermaßen zuverlässig und effizient (im Gebrauch).

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

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

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

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")
14
Rockallite

Dies ist bisher die einzige Antwort, 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 viele andere Antworten versucht dies nicht, die Berechtigungen so anzupassen, dass Dateien/Verzeichnisse entfernt werden können.

11
Jon Chu
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+. Zum Beispiel:

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)
9
Jacob Wan

Vielleicht ist es besser, os.walk() zu verwenden.

os.listdir() unterscheidet Dateien nicht von Verzeichnissen, und Sie werden schnell Probleme bekommen, wenn Sie versuchen, diese zu lösen. Es gibt ein gutes Beispiel für die Verwendung von os.walk() zum rekursiven Entfernen eines Verzeichnisses here und von Hinweisen, wie Sie es an Ihre Gegebenheiten anpassen können.

8
mhawke

Ich weiß, es ist ein alter Thread, aber ich habe etwas interessantes von der offiziellen Python-Seite gefunden. Nur zum Teilen einer anderen Idee zum Entfernen aller Inhalte in einem Verzeichnis. Weil ich bei der Verwendung von shutil.rmtree () einige Autorisierungsprobleme habe und das Verzeichnis nicht entfernen und neu erstellen möchte. Das Original der Adresse lautet 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))
6
Sawyer

Ich habe das Problem auf diese Weise gelöst:

import shutil
import os

shutil.rmtree(dirpath)
os.mkdir(dirpath)
6
ProfHase85

Noch eine andere Lösung:

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

Ziemlich intuitive Art und Weise, es zu tun:

import shutil, os


def remove_folder_contents(path):
    shutil.rmtree(path)
    os.makedirs(path)


remove_folder_contents('/path/to/folder')
4
Manrique

Wenn Sie ein * nix-System verwenden, nutzen Sie den Systembefehl.

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

Ich habe das Problem mit rmtreemakedirs durch Hinzufügen von time.sleep() zwischen

if os.path.isdir(folder_location):
    shutil.rmtree(folder_location)

time.sleep(.5)

os.makedirs(folder_location, 0o777)
2
physlexic

Mach das einfach. Dadurch werden auch alle Dateien innerhalb des Verzeichnisses sowie aus Unterverzeichnissen gelöscht. Ohne Schaden an einem Ordner/Verzeichnis zu verursachen. Funktioniert gut auf Ubuntu ohne Fehler.

import os, re, os.path
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath):
    for file in files:
        os.remove(os.path.join(root, file))
0
Kevin Patel

Beantworten Sie eine begrenzte, spezifische Situation: Wenn Sie die Dateien löschen möchten, während Sie die Unterordnerstruktur verwalten, 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 abseits, aber ich denke, viele würden es für nützlich halten

0
fmonegaglia

der einfachste Weg, um alle Dateien in einem Ordner zu löschen/alle Dateien zu entfernen

import os
files = os.listdir(yourFilePath)
for f in files:
    os.remove(yourFilePath + f)
0
PyBoss

Unter der Annahme, dass temp_dir gelöscht wird, wäre ein einzeiliger Befehl mit os:

_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]

Hinweis: Dies ist nur ein 1-Liner zum Löschen von Dateien. Verzeichnisse werden nicht gelöscht.

Hoffe das hilft. Vielen Dank.

0
End-2-End

Ich bin überrascht, dass niemand die großartige pathlib erwähnt hat, um diesen Job zu machen.

Wenn Sie nur Dateien in einem Verzeichnis entfernen möchten, kann es sich um einen Oneliner handeln

from pathlib import Path

[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()] 

Um Verzeichnisse auch rekursiv zu entfernen, können Sie Folgendes schreiben:

from pathlib import Path
from shutil import rmtree

for path in Path("/path/to/folder").glob("**/*"):
    if path.is_file():
        path.unlink()
    Elif path.is_dir():
        rmtree(path)
0
Husky

Verwenden Sie die folgende Methode, um den Inhalt eines Verzeichnisses zu entfernen, nicht das Verzeichnis selbst:

import os
import shutil

def remove_contents(path):
    for c in os.listdir(path):
        full_path = os.path.join(path, c)
        if os.path.isfile(full_path):
            os.remove(full_path)
        else:
            shutil.rmtree(full_path)
0
Amir Rezazadeh