Hoe verwijder ik een bestand of map in Python?
Antwoord 1, autoriteit 100%
-
os.remove()
verwijdert een bestand. -
os.rmdir()
verwijdert een lege map. -
shutil.rmtree()
verwijdert een map en al zijn inhoud.
Path
objecten van de Python 3.4+ pathlib
-module stelt deze instantie ook bloot methoden:
-
pathlib.Path.unlink()
verwijdert een bestand of symbolische link. -
pathlib.Path.rmdir()
verwijdert een lege map.
Antwoord 2, autoriteit 11%
Python-syntaxis om een bestand te verwijderen
import os
os.remove("/tmp/<file_name>.txt")
Of
import os
os.unlink("/tmp/<file_name>.txt")
Of
pathlibBibliotheek voor Python-versie > = 3,4
file_to_rem = pathlib.Path("/tmp/<file_name>.txt")
file_to_rem.unlink()
Pad.unlink(missing_ok=False)
Ontkoppelmethode die wordt gebruikt om het bestand of de symbolische link te verwijderen.
Als missing_ok false is (de standaard), wordt FileNotFoundError gegenereerd als het pad niet bestaat.
Als missing_ok waar is, worden FileNotFoundError-uitzonderingen genegeerd (hetzelfde gedrag als de opdracht POSIX rm -f).
Gewijzigd in versie 3.8: de parameter missing_ok is toegevoegd.
Beste werkwijze
- Controleer eerst of het bestand of de map bestaat of niet en verwijder dan alleen dat bestand. Dit kan op twee manieren worden bereikt:
A.os.path.isfile("/path/to/file")
B. Gebruikexception handling.
VOORBEELDvoor os.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)
Afhandeling van uitzonderingen
#!/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))
RESPECTIEVE UITGANG
Voer de bestandsnaam in om te verwijderen: demo.txt Fout: demo.txt - Geen dergelijk bestand of map. Voer de bestandsnaam in om te verwijderen: rrr.txt Fout: rrr.txt - Bewerking niet toegestaan. Voer de bestandsnaam in om te verwijderen: foo.txt
Python-syntaxis om een map te verwijderen
shutil.rmtree()
Voorbeeld voor 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))
Antwoord 3, autoriteit 3%
Gebruik
shutil.rmtree(path[, ignore_errors[, onerror]])
(Zie de volledige documentatie op shutil) en/of
os.remove
en
os.rmdir
(Volledige documentatie over os.)
Antwoord 4
Hier is een robuuste functie die zowel os.remove
als shutil.rmtree
gebruikt:
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))
Antwoord 5
U kunt de ingebouwde pathlib
module (vereist Python 3.4+, maar er zijn backports voor oudere versies op PyPI: pathlib
, pathlib2
).
Om een bestand te verwijderen is er de unlink
methode:
import pathlib
path = pathlib.Path(name_of_file)
path.unlink()
Of de rmdir
methode om een legemap te verwijderen:
import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
Antwoord 6
Hoe verwijder ik een bestand of map in Python?
Voor Python 3, om het bestand en de map afzonderlijk te verwijderen, gebruikt u de unlink
en rmdir
Path
objectmethoden respectievelijk:
from pathlib import Path
dir_path = Path.home() / 'directory'
file_path = dir_path / 'file'
file_path.unlink() # remove file
dir_path.rmdir() # remove directory
Houd er rekening mee dat u ook relatieve paden kunt gebruiken met Path
-objecten en dat u uw huidige werkmap kunt controleren met Path.cwd
.
Voor het verwijderen van individuele bestanden en mappen in Python 2, zie de sectie zoals hieronder gelabeld.
Als u een map met inhoud wilt verwijderen, gebruikt u shutil.rmtree
, en merk op dat dit beschikbaar is in Python 2 en 3:
from shutil import rmtree
rmtree(dir_path)
Demonstratie
Nieuw in Python 3.4 is het Path
object.
Laten we er een gebruiken om een map en bestand te maken om het gebruik te demonstreren. Merk op dat we de /
gebruiken om de delen van het pad samen te voegen, dit werkt om problemen tussen besturingssystemen en problemen met het gebruik van backslashes op Windows (waarbij u uw backslashes moet verdubbelen zoals \\
of gebruik onbewerkte tekenreeksen, zoals 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()
en nu:
>>> file_path.is_file()
True
Laten we ze nu verwijderen. Eerst het bestand:
>>> file_path.unlink() # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False
We kunnen globbing gebruiken om meerdere bestanden te verwijderen – laten we eerst een paar bestanden hiervoor maken:
>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()
Itereer dan gewoon het glob-patroon:
>>> 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
Nu demonstreren we het verwijderen van de directory:
>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False
Wat als we een map en alles erin willen verwijderen?
Gebruik voor deze use-case shutil.rmtree
Laten we onze directory en ons bestand opnieuw maken:
file_path.parent.mkdir()
file_path.touch()
en merk op dat rmdir
mislukt tenzij het leeg is, daarom is rmtree zo handig:
>>> 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'
Importeer nu rmtree en geef de map door aan de functie:
from shutil import rmtree
rmtree(directory_path) # remove everything
en we kunnen zien dat het hele ding is verwijderd:
>>> directory_path.exists()
False
Python 2
Als je Python 2 gebruikt, is er een backport van de pathlib-module genaamd pathlib2, die kan worden geïnstalleerd met pip:
$ pip install pathlib2
En dan kun je de bibliotheek aliasen naar pathlib
import pathlib2 as pathlib
Of importeer gewoon direct het Path
object (zoals hier getoond):
from pathlib2 import Path
Als dat te veel is, kunt u bestanden verwijderen met os.remove
of os.unlink
from os import unlink, remove
from os.path import join, expanduser
remove(join(expanduser('~'), 'directory/file'))
of
unlink(join(expanduser('~'), 'directory/file'))
en je kunt mappen verwijderen met os.rmdir
:
from os import rmdir
rmdir(join(expanduser('~'), 'directory'))
Houd er rekening mee dat er ook een os.removedirs
– het verwijdert alleen lege mappen recursief, maar het kan geschikt zijn voor uw gebruik.
Antwoord 7
shutil.rmtree is de asynchrone functie,
dus als je wilt controleren wanneer het voltooid is, kun je while…loop gebruiken
import os
import shutil
shutil.rmtree(path)
while os.path.exists(path):
pass
print('done')
Antwoord 8
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)
Antwoord 9
Voor het verwijderen van bestanden:
os.unlink(path, *, dir_fd=None)
of
os.remove(path, *, dir_fd=None)
Beide functies zijn semantisch hetzelfde. Deze functie verwijdert (verwijdert) het bestandspad. Als pad geen bestand is en het een map is, wordt er een uitzondering gemaakt.
Voor het verwijderen van mappen:
shutil.rmtree(path, ignore_errors=False, onerror=None)
of
os.rmdir(path, *, dir_fd=None)
Om hele mappenbomen te verwijderen, kan shutil.rmtree()
worden gebruikt. os.rmdir
werkt alleen als de map leeg is en bestaat.
Voor het recursief verwijderen van mappen naar ouder:
os.removedirs(name)
Het verwijdert elke lege bovenliggende map met zelf totdat de ouder enige inhoud heeft
bijv. os.removedirs(‘abc/xyz/pqr’) zal de mappen verwijderen op volgorde van ‘abc/xyz/pqr’, ‘abc/xyz’ en ‘abc’ als ze leeg zijn.
Raadpleeg voor meer informatie het officiële document: os.unlink
, os.remove
, os.rmdir
, shutil.rmtree
, os.removedirs
Antwoord 10
Om alle bestanden in de map te verwijderen
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)
Alle mappen in een map verwijderen
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))
Antwoord 11
Om het TOCTOU-probleem te voorkomen dat wordt benadrukt door Eric Araujo’s opmerking, je kunt een uitzondering maken om de juiste methode aan te roepen:
def remove_file_or_dir(path: str) -> None:
""" Remove a file or directory """
try:
shutil.rmtree(path)
except NotADirectoryError:
os.remove(path)
Aangezien shutil.rmtree()
alleen mappen verwijdert en os.remove()
of os.unlink()
alleen bestanden .
Antwoord 12
Mijn persoonlijke voorkeur gaat uit naar het werken met pathlib-objecten – het biedt een meer pythonische en minder foutgevoelige manier om met het bestandssysteem te communiceren, vooral als u platformonafhankelijke code ontwikkelt.
In dat geval kunt u pathlib3x gebruiken – het biedt een backport van de nieuwste (op de datum van schrijven van dit antwoord Python 3.10.a0) Python pathlib voor Python 3.6 of nieuwer, en een paar extra functies zoals “kopiëren”, “copy2”, “copytree”, “rmtree” enz …
Het omhult ook shutil.rmtree
:
$> python -m pip install pathlib3x
$> python
>>> import pathlib3x as pathlib
# delete a directory tree
>>> my_dir_to_delete=pathlib.Path('c:/temp/some_dir')
>>> my_dir_to_delete.rmtree(ignore_errors=True)
# delete a file
>>> my_file_to_delete=pathlib.Path('c:/temp/some_file.txt')
>>> my_file_to_delete.unlink(missing_ok=True)
je kunt het vinden op githubof PyPi
Disclaimer: ik ben de auteur van de pathlib3x-bibliotheek.
Antwoord 13
Ik raad aan om subprocess
te gebruiken als het schrijven van een mooie en leesbare code jouw ding is:
import subprocess
subprocess.Popen("rm -r my_dir", shell=True)
En als u geen software-engineer bent, kunt u overwegen Jupyter te gebruiken; je kunt gewoon bash-commando’s typen:
!rm -r my_dir
Traditioneel gebruik je shutil
:
import shutil
shutil.rmtree(my_dir)