Wie lösche ich eine Datei oder einen Ordner in Python?
Wie lösche ich eine Datei oder einen Ordner in Python?
Antworten:
os.remove()
entfernt eine Datei.
os.rmdir()
Entfernt ein leeres Verzeichnis.
shutil.rmtree()
löscht ein Verzeichnis und seinen gesamten Inhalt.
Path
Objekte aus dem Python 3.4+ pathlib
-Modul machen auch diese Instanzmethoden verfügbar :
pathlib.Path.unlink()
Entfernt eine Datei oder einen symbolischen Link.
pathlib.Path.rmdir()
Entfernt ein leeres Verzeichnis.
os.remove()
eine Ausnahme ausgelöst. Daher muss sie möglicherweise zuerst überprüft os.path.isfile()
oder in eine Datei eingeschlossen werden try
.
os.remove()
wenn eine Datei nicht vorhanden ist, ist FileNotFoundError
.
os.remove()
man mehrere Argumente, um mehrere Dateien zu löschen, oder ruft man sie jedes Mal für jede Datei auf?
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()
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.
os.path.isfile("/path/to/file")
exception 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)
#!/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))
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
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))
Hier ist eine robuste Funktion, die sowohl os.remove
als 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))
remove(path);
Aufrufs.
os.path.islink(file_path):
Ein Fehler sollte seinos.path.islink(path):
Sie können die in-built verwenden pathlib
Modul (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 unlink
Methode:
import pathlib
path = pathlib.Path(name_of_file)
path.unlink()
Oder die rmdir
Methode zum Entfernen eines leeren Ordners:
import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
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.
Wie lösche ich eine Datei oder einen Ordner in Python?
Verwenden Sie für Python 3 die Methoden unlink
und 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 Path
Objekten 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.rmtree
und beachten Sie, dass dies in Python 2 und 3 verfügbar ist:
from shutil import rmtree
rmtree(dir_path)
Neu in Python 3.4 ist das Path
Objekt.
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 rmdir
fehlschlä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
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 Path
Objekt einfach direkt (wie hier gezeigt):
from pathlib2 import Path
Wenn das zu viel ist, können Sie Dateien mit oder entfernenos.remove
os.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.
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)
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')
shutil.rmtree
soll nicht asynchron sein. Es scheint jedoch unter Windows zu sein, dass Virenscanner stören.
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.
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.rmdir
Funktioniert nur, wenn das Verzeichnis leer ist und existiert.
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
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))
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.
Ich empfehle die Verwendung, subprocess
wenn 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)
subprocess
. shutil.rmtree
macht rm -r
den Job ganz gut, mit dem zusätzlichen Bonus, unter Windows zu arbeiten.