Frage

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

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

War es hilfreich?

Lösung

Aktualisiert um nur Dateien zu löschen und die os.path.join() Methode in den Kommentaren vorgeschlagen, verwendet. Wenn Sie auch Verzeichnisse entfernen möchten, Kommentar- der elif Aussage.

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)

Andere Tipps

Versuchen Sie, die shutil Modul

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

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

     

Docstring: Rekursiv löschen a   Verzeichnisbaum.

     

Wenn ignore_errors gesetzt, Fehler   ignoriert; Andernfalls, wenn onerror eingestellt wird,   es heißt den Fehler behandeln mit   Argumente (func, path, exc_info) wo   func ist os.listdir, os.remove oder   os.rmdir; Weg ist das Argument, dass   Funktion, die es zu versagen verursacht; und   exc_info ist ein Tupel zurückgegeben durch   sys.exc_info(). Wenn ignore_errors ist   falsch und onerror ist None, ein   Ausnahme ausgelöst wird.

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

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 in Sie Pfad einen anderen Filter verwenden, zum Beispiel:. /YOU/PATH/*.txt für alle Textdateien in einem Verzeichnis zu entfernen

Die Erweiterung auf mhawke Antwort das ist, was ich implementiert haben. Es entfernt alle Inhalte eines Ordners, aber nicht den Ordner selbst. Getestet auf Linux mit Dateien, Ordnern und symbolischen Links, sollte auch unter Windows arbeiten.

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 der Ordner funktionieren könnte, aber ich habe in Fehler ausgeführt werden, wenn das Löschen und sofort Ordner auf Netzlaufwerke neu zu erstellen.

Die vorgeschlagene Lösung zu Fuß mit nicht funktioniert, wie es rmtree verwendet Ordner zu entfernen und dann versuchen kann, os.unlink auf die Dateien zu verwenden, die in diesen Ordnern vorher waren. Dies führt zu einem Fehler.

Die entsandte glob Lösung wird auch versuchen, nicht-leere Ordner zu löschen, 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)

Dies ist die einzige Antwort, so weit, die:

  • entfernt alle symbolischen Links
    • tote Links
    • Links auf Verzeichnisse
    • Links zu Dateien
  • entfernt Unterverzeichnisse
  • entbindet nicht das übergeordnete Verzeichnis

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, dies nicht versucht, Berechtigungen anpassen Entfernen von Dateien / Verzeichnisse zu ermöglichen.

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 sowie Buchhaltung 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)) )

Hinweis: falls jemand über meine Antwort gestimmt, ich habe hier etwas zu erklären

.
  1. Jeder mag kurz ‚n‘ einfache Antworten. Aber manchmal die Realität ist nicht so einfach.
  2. Zurück zu meiner Antwort. Ich weiß, shutil.rmtree() verwendet werden könnte, einen Verzeichnisbaum zu löschen. Ich habe es oft in meinen eigenen Projekten verwendet. Aber Sie müssen erkennen, dass das Verzeichnis selbst wird auch durch shutil.rmtree() gelöscht . Während dies für einige akzeptabel sein könnte, es ist keine gültige Antwort für den Inhalt eines Ordners zu löschen (ohne Nebenwirkungen) .
  3. Ich zeige Ihnen ein Beispiel für die Nebenwirkungen. Angenommen, Sie haben ein Verzeichnis mit angepasst Eigentümer und Modus-Bits, wo es eine Menge Inhalt. Dann sind Sie es mit shutil.rmtree() löschen und neu erstellen sie mit os.mkdir(). Und Sie werden stattdessen ein leeres Verzeichnis mit Standard (geerbt) Eigentümer und Modus-Bits erhalten. Während Sie das Privileg haben könnten, den Inhalt und auch das Verzeichnis zu löschen, die Sie nicht auf das Verzeichnis mit den ursprünglichen Besitzer und Modus-Bits zurückgesetzt (z Du bist kein Superuser).
  4. der Lage sein,
  5. Schließlich Sie Geduld und lesen Sie den Code . Es ist lang und hässlich (in Sicht), aber bewährt zuverlässig und effizient (in Betrieb) sein.

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

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

  • Es behandelt richtig symbolische Links, einschließlich nicht shutil.rmtree() auf einen symbolischen Link aufrufen (die den os.path.isdir() Test bestehen wird, wenn es in einem Verzeichnis verknüpft, auch das Ergebnis os.walk() symbolisch verknüpften Verzeichnisse als auch enthält)
  • .
  • Es behandelt schreibgeschützt schön Dateien.

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")
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 in Python mit os.scandir 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)

Das könnte Sie besser dran os.walk() für diese verwendet wird.

os.listdir() unterscheidet keine Dateien aus Verzeichnissen und Sie werden schnell in Schwierigkeiten geraten, versuchen, diese zu entkoppeln. Es ist ein gutes Beispiel os.walk() der Verwendung rekursiv ein Verzeichnis entfernen hier , und Hinweise, wie es um Ihre Gegebenheiten anzupassen.

Ich habe das Problem auf diese Weise zu lösen:

import shutil
import os

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

Ich konw es ist ein alter Thread, aber ich habe etwas Interessantes von der offiziellen Website von Python gefunden. Nur für in einem Verzeichnis aller Inhalte zum Entfernen eines andere Idee zu teilen. Denn ich habe einige Probleme mit der Genehmigung, wenn shutil.rmtree mit () und ich will nicht, das Verzeichnis entfernen und neu erstellen. Die Adresse Original ist http://docs.python.org/2/library /os.html#os.walk . Hoffnung, dass könnte jemand 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))

Und noch eine Lösung:

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

Wenn Sie ein * nix-System verwenden, warum nicht das Systemkommando nutzen?

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

Ich bin überrascht, niemand hat den ehrfürchtigen pathlib erwähnt diesen Job zu machen.

Wenn Sie nur Dateien in einem Verzeichnis entfernen möchte, kann es sich um eine oneliner sein

from pathlib import Path

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

Um auch Verzeichnisse rekursiv entfernen Sie so etwas schreiben kann:

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)

beschloß ich, das Problem mit rmtree makedirs durch Zugabe 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: vorausgesetzt, Sie die Dateien löschen möchten, während die Unterordner Baum konserviert, 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,

temp_dir Unter der Annahme, gelöscht werden, ein einzelner Zeilenbefehl os mit wäre:

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

. Hinweis: Dies ist nur ein 1-Liner für das Löschen von Dateien Enthält Verzeichnisse nicht löscht

Hoffe, das hilft. Danke.

Mit der Methode unten 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)

Sie einfach tun. Dadurch werden alle Dateien im Verzeichnis löschen sowie von Unterverzeichnissen auch. Ohne einen beliebigen Ordner / Verzeichnis zu beschädigen. Funktioniert gut auf Ubuntu ohne Fehler.

import os
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))

Dies sollte den Trick nur das OS-Modul zur Liste und entfernen Sie!

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

für mich gearbeitet, alle Probleme lassen Sie mich wissen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top