Hoe verwijder ik een bestand of map?

Hoe verwijder ik een bestand of map in Python?


Antwoord 1, autoriteit 100%


Pathobjecten van de Python 3.4+ pathlib-module stelt deze instantie ook bloot methoden:


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

  1. 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. Gebruik exception 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.removeals shutil.rmtreegebruikt:

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 pathlibmodule (vereist Python 3.4+, maar er zijn backports voor oudere versies op PyPI: pathlib, pathlib2).

Om een ​​bestand te verwijderen is er de unlinkmethode:

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

Of de rmdirmethode 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 unlinken rmdirPathobjectmethoden 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 Pathobject.

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 rmdirmislukt 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 Pathobject (zoals hier getoond):

from pathlib2 import Path

Als dat te veel is, kunt u bestanden verwijderen met os.removeof 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.rmdirwerkt 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 subprocesste 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) 

Other episodes