¿Cómo borrar un archivo o carpeta?

Respuestas:

3347

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

RichieHindle
fuente
55
os.rmdir () en Windows también elimina el enlace simbólico del directorio incluso si el directorio de destino no está vacío
Lu55
8
Si el archivo no existe, os.remove()lanza una excepción, por lo que puede ser necesario verificar os.path.isfile()primero o envolver en un try.
Ben Crowell
2
Deseo que Path.unlink 1 / sea recursivo 2 / agregue una opción para ignorar FileNotfoundError.
Jérôme
77
solo para completar ... la excepción lanzada por os.remove()si un archivo no existe es FileNotFoundError.
PedroA
¿ os.remove() Toma múltiples argumentos para eliminar múltiples archivos, o lo llama cada vez para cada archivo?
user742864
292

Sintaxis de Python para borrar un archivo

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

O

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

O

Biblioteca pathlib para Python versión> 3.5

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 simbólico.

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

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")
    si. Utilizarexception 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))

SALIDA RESPECTIVA

Ingrese el nombre del archivo a eliminar: demo.txt
Error: demo.txt: no existe dicho archivo o directorio.

Ingrese el nombre del archivo a eliminar: rrr.txt
Error: rrr.txt - Operación no permitida.

Ingrese el nombre del archivo a 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))
anand tripathi
fuente
13
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 Python FAQ docs.python.org/3/glossary.html#term-eafp
Éric Araujo
84

Utilizar

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

(Consulte la documentación completa sobre shutil ) y / o

os.remove

y

os.rmdir

(Documentación completa en os .)

Mihai Maruseac
fuente
66
Agregue la interfaz pathlib (nueva desde Python 3.4) a su lista.
Paebbels
38

Aquí hay una función robusta que usa ambos 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))
flycee
fuente
8
Es decir, 8 líneas de código para simular la remove(path);llamada ISO C.
Kaz
2
@Kaz acordó molesto, pero ¿eliminar trato con árboles? :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
66
os.path.islink(file_path): un error, debería seros.path.islink(path):
Neo li
32

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()
MSeifert
fuente
2
¿Qué pasa con un directorio no vacío?
Pranasas
@Pranasas Desafortunadamente, parece que no hay nada (de forma nativa) pathlibque pueda 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, así que no lo he incluido.
MSeifert
30

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

Para Python 3, para eliminar el archivo y el directorio individualmente, use los métodos unlinky objeto 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 las barras invertidas \\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 vamos a eliminarlos. 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 solo itera sobre el patrón glob:

>>> 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 la eliminación del 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, useshutil.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, razón por la cual 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 la biblioteca para pathlib

import pathlib2 as pathlib

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

from pathlib2 import Path

Si eso 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 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.

Aaron Hall
fuente
rmtree(directory_path)funciona en python 3.6.6 pero no en python 3.5.2: rmtree(str(directory_path)))allí lo necesita .
Stein
4
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)
Lalithesh
fuente
1
Esto eliminará solo los archivos dentro de la carpeta y las subcarpetas, dejando la estructura de carpetas intacta ..
Lalithesh
4

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')
m0z4rt
fuente
1
shutil.rmtreeNo se supone que sea asíncrono. Sin embargo, puede parecer que está en Windows con los escáneres de virus que interfieren.
mhsmith
Escáneres de virus @mhsmith ? ¿Es una especulación salvaje, o realmente sabes que pueden causar este efecto? ¿Cómo diablos funciona eso si es así?
Mark Amery el
2

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 recursivamente hacia padres:

os.removedirs(name)

Elimina cada directorio padre vacío con self 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 cheque documento oficial: os.unlink, os.remove, os.rmdir, shutil.rmtree,os.removedirs

Somnath Muluk
fuente
1

Para eliminar todos los archivos en 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 en 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))
Sarender Reddy
fuente
0

Para evitar el problema TOCTOU resaltado por el 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)

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

Isaac Turner
fuente
shutil.rmtree()elimina no solo el directorio sino también su contenido.
Tiago Martins Peres 李大仁
-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 eres un ingeniero de software, entonces quizás consideres usar Jupyter; simplemente puede escribir comandos bash:

!rm -r my_dir

Tradicionalmente, usas shutil:

import shutil
shutil.rmtree(my_dir) 
Miladiosos
fuente
3
El subproceso es una práctica para evitar
dlewin
3
No lo recomendaría subprocesspara esto. shutil.rmtreefunciona rm -rbien, con la ventaja adicional de trabajar en Windows.
Mark Amery el