¿Cómo eliminar un archivo o carpeta en Python?

2659

¿Cómo elimino un archivo o carpeta en Python?

0
4045

PathLos objetos del pathlibmódulo Python 3.4+ también exponen estos métodos de instancia:

8
  • 7
    os.rmdir () en Windows también elimina el enlace simbólico del directorio incluso si el directorio de destino no está vacío
    Lu55
    18 dic 2015 a las 17:23
  • 53
    Si el archivo no existe, os.remove()genera una excepción, por lo que puede ser necesario verificar os.path.isfile()primero o ajustar en un try. 4 de julio de 2018 a las 0:00
  • 2
    Desearía que Path.unlink 1 / fuera recursivo 2 / agregue una opción para ignorar FileNotfoundError. 10/07/2018 a las 13:52
  • 14
    solo para completar ... la excepción lanzada por os.remove()si un archivo no existe es FileNotFoundError.
    PedroA
    4 feb.20 a las 17:52
  • 5
    ¡Creo que @ Jérôme missing_ok=True, agregado en 3.8 resuelve eso!
    Felix
    8 dic.20 a las 21:04
453

Sintaxis de Python para eliminar un archivo

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

O

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

O

Biblioteca pathlib para la versión de Python> = 3.4

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

Path.unlink (missing_ok = False)

Método de desvinculación utilizado para eliminar el archivo o el enlace symbolik.

If missing_ok is false (the default), FileNotFoundError is raised if the path does not exist.
If missing_ok is true, FileNotFoundError exceptions will be ignored (same behavior as the POSIX rm -f command).
Changed in version 3.8: The missing_ok parameter was added.

Mejores prácticas

  1. Primero, verifique si el archivo o carpeta existe o no, luego solo elimine ese archivo. Esto se puede lograr de dos maneras:
    a. os.path.isfile("/path/to/file")
    B. Usarexception handling.

EJEMPLO paraos.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)

Manejo de excepciones

#!/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))

RESULTADO RESPECTIVO

Enter file name to delete : demo.txt
Error: demo.txt - No such file or directory.

Enter file name to delete : rrr.txt
Error: rrr.txt - Operation not permitted.

Enter file name to delete : foo.txt

Sintaxis de Python para eliminar una carpeta

shutil.rmtree()

Ejemplo para 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))
3
101

Usar

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

(Ver documentación completa sobre shutil ) y / o

os.remove

y

os.rmdir

(Documentación completa sobre el sistema operativo ).

1
  • 8
    Agregue la interfaz pathlib (nueva desde Python 3.4) a su lista. 25/04/2016 a las 19:38
59

Aquí hay una función robusta que usa os.removey 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))
3
  • 11
    Es decir, 8 líneas de código para simular la remove(path);llamada ISO C.
    Kaz
    21/04/2017 a las 23:22
  • 2
    @Kaz estuvo de acuerdo en molesto, pero ¿eliminar el trato con los árboles? :-) 8 de septiembre de 2018 a las 22:37
  • 6
    os.path.islink(file_path): un error, debería ser os.path.islink(path):
    Neo li
    23/01/20 a las 9:17
40

Puede utilizar la incorporada en el pathlibmódulo (requiere Python 3.4+, pero hay backports para versiones anteriores en PyPI: pathlib, pathlib2).

Para eliminar un archivo existe el unlinkmétodo:

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

O el rmdirmétodo para eliminar una carpeta vacía :

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
2
  • 6
    Sin embargo, ¿qué pasa con un directorio no vacío? 11/07/2018 a las 8:43
  • 1
    @Pranasas Desafortunadamente, parece que no hay nada (de forma nativa) pathlibque pueda manejar la eliminación de directorios no vacíos. Sin embargo, podría usar shutil.rmtree. Se ha mencionado en varias de las otras respuestas, por lo que no lo he incluido. 11/07/18 a las 8:46
36

How do I delete a file or folder in Python?

Para Python 3, para eliminar el archivo y el directorio individualmente, use los métodos de objeto unlinky respectivamente: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

Tenga en cuenta que también puede usar rutas relativas con Pathobjetos y puede verificar su directorio de trabajo actual con Path.cwd.

Para eliminar archivos y directorios individuales en Python 2, consulte la sección etiquetada a continuación.

Para eliminar un directorio con contenido, use shutil.rmtreey tenga en cuenta que está disponible en Python 2 y 3:

from shutil import rmtree

rmtree(dir_path)

Demostración

Nuevo en Python 3.4 es el Pathobjeto.

Usemos uno para crear un directorio y un archivo para demostrar el uso. Tenga en cuenta que usamos /para unir las partes de la ruta, esto soluciona los problemas entre los sistemas operativos y los problemas del uso de barras invertidas en Windows (donde necesitaría duplicar sus barras invertidas como \\o usar cadenas sin procesar, como 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()

y ahora:

>>> file_path.is_file()
True

Ahora eliminémoslos. Primero el archivo:

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

Podemos usar globbing para eliminar varios archivos; primero creemos algunos archivos para esto:

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

Luego, repita el patrón global:

>>> 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

Ahora, demostrando cómo eliminar el directorio:

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

¿Qué pasa si queremos eliminar un directorio y todo lo que contiene? Para este caso de uso, utiliceshutil.rmtree

Recreemos nuestro directorio y archivo:

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

y tenga en cuenta que rmdirfalla a menos que esté vacío, por lo que rmtree es tan conveniente:

>>> 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'

Ahora, importe rmtree y pase el directorio a la función:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

y podemos ver que todo se ha eliminado:

>>> directory_path.exists()
False

Python 2

Si está en Python 2, hay un backport del módulo pathlib llamado pathlib2 , que se puede instalar con pip:

$ pip install pathlib2

Y luego puedes alias de la biblioteca a pathlib

import pathlib2 as pathlib

O simplemente importe directamente el Pathobjeto (como se muestra aquí):

from pathlib2 import Path

Si es demasiado, puede eliminar archivos con os.removeoos.unlink

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

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

o

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

y puede eliminar directorios con os.rmdir:

from os import rmdir

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

Tenga en cuenta que también hay un os.removedirs: solo elimina directorios vacíos de forma recursiva, pero puede adaptarse a su caso de uso.

1
  • rmtree(directory_path)funciona en python 3.6.6 pero no en python 3.5.2; lo necesita rmtree(str(directory_path))).
    Stein
    22 de agosto de 2018 a las 8:48
6

shutil.rmtree es la función asincrónica, por lo que si desea verificar cuándo se completa, puede usar while ... loop

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')
2
  • 1
    shutil.rmtreeno se supone que sea asincrónico. Sin embargo, puede parecer que está en Windows con la interferencia de los escáneres de virus.
    mhsmith
    2 de agosto de 2018 a las 21:04
  • @mhsmith ¿ Escáneres de virus ? ¿Es eso una especulación salvaje, o realmente sabe que pueden causar este efecto? ¿Cómo diablos funciona eso si es así? 4 de julio de 2019 a las 23:02
5
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
  • 1
    Esto eliminará solo los archivos dentro de la carpeta y las subcarpetas, dejando intacta la estructura de la carpeta. 28 feb 2018 a las 11:30
5

Para borrar archivos:

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

o

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

Ambas funciones son semánticamente iguales. Esta función elimina (elimina) la ruta del archivo. Si la ruta no es un archivo y es un directorio, se genera una excepción.

Para eliminar carpetas:

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

o

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

Para eliminar árboles de directorios completos, shutil.rmtree()se puede utilizar. os.rmdirsolo funciona cuando el directorio está vacío y existe.

Para eliminar carpetas de forma recursiva hacia el padre:

os.removedirs(name)

Elimina todos los directorios principales vacíos con uno mismo hasta el padre que tiene algún contenido

ex. os.removedirs('abc/xyz/pqr') will remove the directories by order 'abc/xyz/pqr', 'abc/xyz' and 'abc' if they are empty.

Para obtener más información cheque documento oficial: os.unlink, os.remove, os.rmdir, shutil.rmtree,os.removedirs

0

Para eliminar todos los archivos de la carpeta

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)

Para eliminar todas las carpetas de un directorio

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

Para evitar el problema TOCTOU resaltado por el comentario de Éric Araujo , puede capturar una excepción para llamar al método correcto:

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

Dado shutil.rmtree()que solo eliminará directorios y / os.remove()o os.unlink()solo eliminará archivos.

1
  • shutil.rmtree() elimina no solo el directorio sino también su contenido. 30 abr.20 a las 8:22
0

Mi preferencia personal es trabajar con objetos pathlib: ofrece una forma más pitónica y menos propensa a errores de interactuar con el sistema de archivos, especialmente si desarrolla código multiplataforma.

En ese caso, puede usar pathlib3x: ofrece un backport de la última (en la fecha de redacción de esta respuesta Python 3.10.a0) Python pathlib para Python 3.6 o posterior, y algunas funciones adicionales como "copiar", "copiar2" , "copytree", "rmtree", etc.

También envuelve 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)

lo puedes encontrar en github o PyPi


Descargo de responsabilidad: soy el autor de la biblioteca pathlib3x.

0
-1

Recomiendo usar subprocesssi escribir un código hermoso y legible es su taza de té:

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

Y si no es un ingeniero de software, entonces considere usar Jupyter; simplemente puede escribir comandos bash:

!rm -r my_dir

Tradicionalmente, usas shutil:

import shutil
shutil.rmtree(my_dir) 
2
  • 3
    El subproceso es una práctica para evitar
    dlewin
    29/01/19 a las 15:01
  • 3
    No lo recomendaría subprocesspara esto. shutil.rmtreefunciona rm -rbien, con la ventaja adicional de trabajar en Windows. 4 de julio de 2019 a las 23:04