Wie lösche ich eine Datei oder einen Ordner?


Antworten:


3343

PathObjekte aus dem Python 3.4+ pathlib-Modul machen auch diese Instanzmethoden verfügbar :


5
os.rmdir () unter Windows entfernt auch Verzeichnissymbolverknüpfungen, selbst wenn das Zielverzeichnis nicht leer ist
Lu55

8
Wenn die Datei nicht vorhanden ist, wird os.remove()eine Ausnahme ausgelöst. Daher muss sie möglicherweise zuerst überprüft os.path.isfile()oder in eine Datei eingeschlossen werden try.
Ben Crowell

2
Ich wünschte, Path.unlink 1 / wäre rekursiv 2 / füge eine Option hinzu, um FileNotfoundError zu ignorieren.
Jérôme

7
Nur zur Vervollständigung ... die Ausnahme, die ausgelöst wird, os.remove()wenn eine Datei nicht vorhanden ist, ist FileNotFoundError.
PedroA

Benötigt os.remove() man mehrere Argumente, um mehrere Dateien zu löschen, oder ruft man sie jedes Mal für jede Datei auf?
user742864

292

Python-Syntax zum Löschen einer Datei

import os
os.remove("/tmp/<file_name>.txt")

Oder

import os
os.unlink("/tmp/<file_name>.txt")

Oder

pathlib Library für Python Version> 3.5

file_to_rem = pathlib.Path("/tmp/<file_name>.txt")
file_to_rem.unlink()

Path.unlink (missing_ok = False)

Unlink-Methode zum Entfernen der Datei oder des Symbolik-Links.

Wenn missing_ok false ist (Standardeinstellung), wird FileNotFoundError ausgelöst, wenn der Pfad nicht vorhanden ist.
Wenn "Missing_ok" auf "true" gesetzt ist, werden FileNotFoundError-Ausnahmen ignoriert (dasselbe Verhalten wie beim Befehl POSIX rm -f).
In Version 3.8 geändert: Der Parameter "Missing_ok" wurde hinzugefügt.

Beste Übung

  1. Überprüfen Sie zunächst, ob die Datei oder der Ordner vorhanden ist, und löschen Sie dann nur diese Datei. Dies kann auf zwei Arten erreicht werden:
    a. os.path.isfile("/path/to/file")
    b. Verwendenexception handling.

BEISPIEL füros.path.isfile

#!/usr/bin/python
import os
myfile="/tmp/foo.txt"

## If file exists, delete it ##
if os.path.isfile(myfile):
    os.remove(myfile)
else:    ## Show an error ##
    print("Error: %s file not found" % myfile)

Ausnahmebehandlung

#!/usr/bin/python
import os

## Get input ##
myfile= raw_input("Enter file name to delete: ")

## Try to delete the file ##
try:
    os.remove(myfile)
except OSError as e:  ## if failed, report it back to the user ##
    print ("Error: %s - %s." % (e.filename, e.strerror))

RESPEKTIVE AUSGABE

Geben Sie den zu löschenden Dateinamen ein: demo.txt
Fehler: demo.txt - Keine solche Datei oder kein solches Verzeichnis.

Geben Sie den zu löschenden Dateinamen ein: rrr.txt
Fehler: rrr.txt - Vorgang nicht zulässig.

Geben Sie den zu löschenden Dateinamen ein: foo.txt

Python-Syntax zum Löschen eines Ordners

shutil.rmtree()

Beispiel für shutil.rmtree()

#!/usr/bin/python
import os
import sys
import shutil

# Get directory name
mydir= raw_input("Enter directory name: ")

## Try to remove tree; if failed show an error using try...except on screen
try:
    shutil.rmtree(mydir)
except OSError as e:
    print ("Error: %s - %s." % (e.filename, e.strerror))

13
Bei der Überprüfung wird eine Ausnahmebehandlung empfohlen, da die Datei zwischen den beiden Zeilen entfernt oder geändert werden kann (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use ). Siehe Python-FAQ docs.python.org/3/glossary.html#term-eafp
Éric Araujo

84

Verwenden

shutil.rmtree(path[, ignore_errors[, onerror]])

(Siehe vollständige Dokumentation zu Shutil ) und / oder

os.remove

und

os.rmdir

(Vollständige Dokumentation zu OS .)


6
Bitte fügen Sie die Pathlib-Schnittstelle (neu seit Python 3.4) zu Ihrer Liste hinzu.
Paebbels

38

Hier ist eine robuste Funktion, die sowohl os.removeals auch verwendet shutil.rmtree:

def remove(path):
    """ param <path> could either be relative or absolute. """
    if os.path.isfile(path) or os.path.islink(path):
        os.remove(path)  # remove the file
    elif os.path.isdir(path):
        shutil.rmtree(path)  # remove dir and all contains
    else:
        raise ValueError("file {} is not a file or dir.".format(path))

8
Dh 8 Codezeilen zur Simulation des ISO C- remove(path);Aufrufs.
Kaz

2
@Kaz stimmte nervig zu, aber entfernt sich der Umgang mit Bäumen? :-)
Ciro Santilli 法轮功 病毒 审查 六四 事件 8

6
os.path.islink(file_path): Ein Fehler sollte seinos.path.islink(path):
Neo li

32

Sie können die in-built verwenden pathlibModul (benötigt Python 3.4+, aber es gibt updates für ältere Versionen auf PyPI: pathlib, pathlib2).

Um eine Datei zu entfernen, gibt es folgende unlinkMethode:

import pathlib
path = pathlib.Path(name_of_file)
path.unlink()

Oder die rmdirMethode zum Entfernen eines leeren Ordners:

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()

2
Was ist mit einem nicht leeren Verzeichnis?
Pranasas

@Pranasas Leider scheint nichts (nativ) darin zu sein pathlib, das Löschen nicht leerer Verzeichnisse zu handhaben. Wie auch immer Sie verwenden könnten shutil.rmtree. Es wurde in mehreren anderen Antworten erwähnt, daher habe ich es nicht aufgenommen.
MSeifert

29

Wie lösche ich eine Datei oder einen Ordner in Python?

Verwenden Sie für Python 3 die Methoden unlinkund object , um die Datei und das Verzeichnis einzeln zu entfernen :rmdir Path

from pathlib import Path
dir_path = Path.home() / 'directory' 
file_path = dir_path / 'file'

file_path.unlink() # remove file

dir_path.rmdir()   # remove directory

Beachten Sie, dass Sie auch relative Pfade mit PathObjekten verwenden und Ihr aktuelles Arbeitsverzeichnis mit überprüfen können Path.cwd.

Informationen zum Entfernen einzelner Dateien und Verzeichnisse in Python 2 finden Sie im folgenden Abschnitt.

Um ein Verzeichnis mit Inhalten zu entfernen, verwenden Sie shutil.rmtreeund beachten Sie, dass dies in Python 2 und 3 verfügbar ist:

from shutil import rmtree

rmtree(dir_path)

Demonstration

Neu in Python 3.4 ist das PathObjekt.

Verwenden wir eins, um ein Verzeichnis und eine Datei zu erstellen, um die Verwendung zu demonstrieren. Beachten Sie, dass wir das verwenden /, um die Teile des Pfads zu verbinden. Dies umgeht Probleme zwischen Betriebssystemen und Probleme bei der Verwendung von Backslashes unter Windows (bei denen Sie entweder Ihre Backslashes wie verdoppeln \\oder rohe Zeichenfolgen wie verwenden müssen r"foo\bar"):

from pathlib import Path

# .home() is new in 3.5, otherwise use os.path.expanduser('~')
directory_path = Path.home() / 'directory'
directory_path.mkdir()

file_path = directory_path / 'file'
file_path.touch()

und nun:

>>> file_path.is_file()
True

Jetzt löschen wir sie. Zuerst die Datei:

>>> file_path.unlink()     # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False

Wir können Globbing verwenden, um mehrere Dateien zu entfernen. Lassen Sie uns zunächst einige Dateien dafür erstellen:

>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()

Dann iterieren Sie einfach über das Glob-Muster:

>>> for each_file_path in directory_path.glob('*.my'):
...     print(f'removing {each_file_path}')
...     each_file_path.unlink()
... 
removing ~/directory/foo.my
removing ~/directory/bar.my

Demonstrieren Sie nun das Entfernen des Verzeichnisses:

>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False

Was ist, wenn wir ein Verzeichnis und alles darin entfernen möchten? Verwenden Sie für diesen Anwendungsfallshutil.rmtree

Lassen Sie uns unser Verzeichnis und unsere Datei neu erstellen:

file_path.parent.mkdir()
file_path.touch()

und beachten Sie, dass dies rmdirfehlschlägt, es sei denn, es ist leer, weshalb rmtree so praktisch ist:

>>> directory_path.rmdir()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~/anaconda3/lib/python3.6/pathlib.py", line 1270, in rmdir
    self._accessor.rmdir(self)
  File "~/anaconda3/lib/python3.6/pathlib.py", line 387, in wrapped
    return strfunc(str(pathobj), *args)
OSError: [Errno 39] Directory not empty: '/home/username/directory'

Importieren Sie nun rmtree und übergeben Sie das Verzeichnis an die Funktion:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

und wir können sehen, dass das Ganze entfernt wurde:

>>> directory_path.exists()
False

Python 2

Wenn Sie mit Python 2 arbeiten, gibt es einen Backport des pathlib-Moduls namens pathlib2 , der mit pip installiert werden kann:

$ pip install pathlib2

Und dann können Sie die Bibliothek mit einem Alias ​​versehen pathlib

import pathlib2 as pathlib

Oder importieren Sie das PathObjekt einfach direkt (wie hier gezeigt):

from pathlib2 import Path

Wenn das zu viel ist, können Sie Dateien mit oder entfernenos.removeos.unlink

from os import unlink, remove
from os.path import join, expanduser

remove(join(expanduser('~'), 'directory/file'))

oder

unlink(join(expanduser('~'), 'directory/file'))

und Sie können Verzeichnisse entfernen mit os.rmdir:

from os import rmdir

rmdir(join(expanduser('~'), 'directory'))

Beachten Sie, dass es auch ein gibt os.removedirs- es entfernt leere Verzeichnisse nur rekursiv, aber es kann Ihrem Anwendungsfall entsprechen.


rmtree(directory_path)funktioniert in Python 3.6.6, aber nicht in Python 3.5.2 - Sie brauchen rmtree(str(directory_path)))dort.
Stein

4
import os

folder = '/Path/to/yourDir/'
fileList = os.listdir(folder)

for f in fileList:
    filePath = folder + '/'+f

    if os.path.isfile(filePath):
        os.remove(filePath)

    elif os.path.isdir(filePath):
        newFileList = os.listdir(filePath)
        for f1 in newFileList:
            insideFilePath = filePath + '/' + f1

            if os.path.isfile(insideFilePath):
                os.remove(insideFilePath)

1
Dadurch werden nur die Dateien im Ordner und in den Unterordnern gelöscht, wobei die Ordnerstruktur intakt bleibt.
Lalithesh

4

shutil.rmtree ist die asynchrone Funktion. Wenn Sie also überprüfen möchten, wann sie abgeschlossen ist, können Sie die while-Schleife verwenden

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

1
shutil.rmtreesoll nicht asynchron sein. Es scheint jedoch unter Windows zu sein, dass Virenscanner stören.
Mhsmith

@mhsmith Virenscanner ? Ist das wilde Spekulation oder wissen Sie tatsächlich, dass sie diesen Effekt verursachen können? Wie um alles in der Welt funktioniert das, wenn ja?
Mark Amery

2

Zum Löschen von Dateien:

os.unlink(path, *, dir_fd=None)

oder

os.remove(path, *, dir_fd=None)

Beide Funktionen sind semantisch gleich. Diese Funktion entfernt (löscht) den Dateipfad. Wenn path keine Datei und kein Verzeichnis ist, wird eine Ausnahme ausgelöst.

Zum Löschen von Ordnern:

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

oder

os.rmdir(path, *, dir_fd=None)

Um ganze Verzeichnisbäume zu entfernen, shutil.rmtree()kann verwendet werden. os.rmdirFunktioniert nur, wenn das Verzeichnis leer ist und existiert.

Zum rekursiven Löschen von Ordnern in Richtung übergeordneter Ordner:

os.removedirs(name)

Es entfernt jedes leere übergeordnete Verzeichnis mit self bis zum übergeordneten Verzeichnis, das Inhalt enthält

Ex. os.removedirs ('abc / xyz / pqr') entfernt die Verzeichnisse in der Reihenfolge 'abc / xyz / pqr', 'abc / xyz' und 'abc', wenn sie leer sind.

Für weitere Informationen Check offiziell doc: os.unlink, os.remove, os.rmdir, shutil.rmtree,os.removedirs


1

So entfernen Sie alle Dateien im Ordner

import os
import glob

files = glob.glob(os.path.join('path/to/folder/*'))
files = glob.glob(os.path.join('path/to/folder/*.csv')) // It will give all csv files in folder
for file in files:
    os.remove(file)

So entfernen Sie alle Ordner in einem Verzeichnis

from shutil import rmtree
import os

// os.path.join()  # current working directory.

for dirct in os.listdir(os.path.join('path/to/folder')):
    rmtree(os.path.join('path/to/folder',dirct))

0

Um das in Éric Araujos Kommentar hervorgehobene TOCTOU- Problem zu vermeiden , können Sie eine Ausnahme abfangen, um die richtige Methode aufzurufen:

def remove_file_or_dir(path: str) -> None:
    """ Remove a file or directory """
    try:
        shutil.rmtree(path)
    except NotADirectoryError:
        os.remove(path)

Da shutil.rmtree()werden nur Verzeichnisse und / os.remove()oder os.unlink()nur Dateien entfernt.


shutil.rmtree()Entfernt nicht nur das Verzeichnis, sondern auch dessen Inhalt.
Tiago Martins Peres 30

-1

Ich empfehle die Verwendung, subprocesswenn das Schreiben eines schönen und lesbaren Codes Ihre Tasse Tee ist:

import subprocess
subprocess.Popen("rm -r my_dir", shell=True)

Und wenn Sie kein Softwareentwickler sind, sollten Sie Jupyter in Betracht ziehen. Sie können einfach Bash-Befehle eingeben:

!rm -r my_dir

Traditionell verwenden Sie shutil:

import shutil
shutil.rmtree(my_dir) 

3
Unterprozess ist Praxis zu vermeiden
Dlewin

3
Ich würde es nicht empfehlen subprocess. shutil.rmtreemacht rm -rden Job ganz gut, mit dem zusätzlichen Bonus, unter Windows zu arbeiten.
Mark Amery
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.