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

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

preguntado el 09 de agosto de 11 a las 10:08

13 Respuestas


Path objetos de Python 3.4+ pathlib módulo también expone estos métodos de instancia:

Respondido el 29 de enero de 20 a las 13:01

os.rmdir () en Windows también elimina el enlace simbólico del directorio incluso si el directorio de destino no está vacío - Lu55

Si el archivo no existe, os.remove() arroja una excepción, por lo que puede ser necesario comprobar os.path.isfile() primero, o envolver en un try. - ben crowell

Desearía que Path.unlink 1 / fuera recursivo 2 / agregue una opción para ignorar FileNotfoundError. - Jérôme

solo para completar ... la excepción lanzada por os.remove() si un archivo no existe es FileNotFoundError. - PedroA

@ Jérôme creo missing_ok=True, adicional en 3.8 resuelve eso! - Felix

Sintaxis de Python para eliminar un archivo

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

Or

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

Or

Pathlib Biblioteca 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.

Si missing_ok es falso (el valor predeterminado), se genera FileNotFoundError si la ruta no existe.
Si missing_ok es verdadero, se ignorarán las excepciones FileNotFoundError (el mismo comportamiento que el comando POSIX rm -f).
Modificado en la versión 3.8: se agregó el parámetro missing_ok.

Buenas prácticas

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

EJEMPLO es 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)

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

Ingrese el nombre del archivo para eliminar: demo.txt Error: demo.txt - No existe tal archivo o directorio. Ingrese el nombre del archivo para eliminar: rrr.txt Error: rrr.txt - Operación no permitida. Ingrese el nombre del archivo para eliminar: 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))

respondido 23 nov., 20:19

Se recomienda el manejo de excepciones en lugar de la verificación porque el archivo podría eliminarse o cambiarse entre las dos líneas (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use) Ver las preguntas frecuentes de Python docs.python.org/3/glossary.html#term-eafp - Éric Araujo

También EAFP se prefiere sobre LBI en Python. - jaaq

¿Cuál es el punto de detectar la excepción en el último ejemplo? - Welgriv

Utilice la herramienta

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

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

os.remove

y

os.rmdir

(Documentación completa sobre os.)

Respondido el 07 de junio de 18 a las 16:06

Agregue la interfaz pathlib (nueva desde Python 3.4) a su lista. - Paebbels

Aquí hay una función robusta que usa tanto os.remove y 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))

contestado el 06 de mayo de 20 a las 15:05

Es decir, 8 líneas de código para simular la ISO C remove(path); llamada. - Kaz

@Kaz estuvo de acuerdo en molesto, pero ¿eliminar el trato con los árboles? :-) - Ciro Santilli 新疆 再教育 营 六四 事件 法轮功 郝海东

os.path.islink(file_path): un error, debería ser os.path.islink(path): - neo-li

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

Para eliminar un archivo existe el unlink método:

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

O la rmdir método para eliminar un vacío carpeta:

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

Respondido el 24 de Septiembre de 17 a las 11:09

Sin embargo, ¿qué pasa con un directorio no vacío? - pranasas

@Pranasas Desafortunadamente, parece que no hay nada (de forma nativa) en pathlib que puede manejar la eliminación de directorios no vacíos. Sin embargo, podrías usar shutil.rmtree. Se ha mencionado en varias de las otras respuestas, por lo que no lo he incluido. - MSeifert

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

Para Python 3, para eliminar el archivo y el directorio individualmente, use el unlink y rmdir Path métodos de objeto respectivamente:

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 utilizar rutas relativas con Path objetos, 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.rmtree, y tenga en cuenta que esto está disponible en Python 2 y 3:

from shutil import rmtree

rmtree(dir_path)

Demostración

Nuevo en Python 3.4 es el Path objeto.

Usemos uno para crear un directorio y un archivo para demostrar el uso. Tenga en cuenta que usamos el / 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 usa 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, utilice shutil.rmtree

Recreemos nuestro directorio y archivo:

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

y nota que rmdir falla 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

2 Python

Si está en Python 2, hay una 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 Path objeto (como se demuestra aquí):

from pathlib2 import Path

Si es demasiado, puede eliminar archivos con os.remove or os.unlink

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

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

or

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

y puedes 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.

respondido 02 mar '20, 18:03

rmtree(directory_path) funciona en python 3.6.6 pero no en python 3.5.2 - necesita rmtree(str(directory_path))) allí. - Stein

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

respondido 23 mar '18, 17:03

shutil.rmtree no se supone que sea asincrónico. Sin embargo, puede parecer que está en Windows con la interferencia de los escáneres de virus. - mhsmith

@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í? - marca amery

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)

Respondido 25 Oct 17, 13:10

Esto eliminará solo los archivos dentro de la carpeta y las subcarpetas, dejando intacta la estructura de la carpeta. Lalithesh

Para borrar archivos:

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

or

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)

or

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

Para eliminar árboles de directorios completos, shutil.rmtree() puede ser usado. os.rmdir solo 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') eliminará los directorios por orden 'abc / xyz / pqr', 'abc / xyz' y 'abc' si están vacíos.

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

Respondido 01 ago 19, 06:08

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

Respondido el 12 de diciembre de 19 a las 12:12

Para evitar el TOCTÚ problema destacado por Comentario de Éric Araujo, puede detectar 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)

Como shutil.rmtree() solo eliminará directorios y os.remove() or os.unlink() solo eliminará archivos.

Respondido 08 Feb 20, 13:02

shutil.rmtree() elimina no solo el directorio sino también su contenido. - Tiago Martins Peres 李大仁

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)

puedes encontrarlo en gitHub or PyPi


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

Respondido 05 Jul 20, 15:07

Recomiendo el uso de subprocess si escribir un código hermoso y legible es lo tuyo:

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) 

contestado el 31 de mayo de 18 a las 00:05

El subproceso es una práctica para evitar: dlewin

No lo recomendaría subprocess para esto. shutil.rmtreerm -rEl trabajo está bien, con la ventaja adicional de trabajar en Windows. - marca amery

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.