¿Cómo eliminar un archivo o carpeta en Python?
Frecuentes
Visto 2,447 veces
13 Respuestas
4024
os.remove()
elimina un archivo.os.rmdir()
elimina un directorio vacío.shutil.rmtree()
elimina un directorio y todo su contenido.
Path
objetos de Python 3.4+ pathlib
módulo también expone estos métodos de instancia:
pathlib.Path.unlink()
elimina un archivo o enlace simbólico.pathlib.Path.rmdir()
elimina un directorio vacío.
Respondido el 29 de enero de 20 a las 13:01
447
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
- 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. Usarexception 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
¿Cuál es el punto de detectar la excepción en el último ejemplo? - Welgriv
58
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
39
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
36
¿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
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')
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
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)
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
5
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
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))
Respondido el 12 de diciembre de 19 a las 12:12
0
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 李大仁
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)
puedes encontrarlo en gitHub or PyPi
Descargo de responsabilidad: soy el autor de la biblioteca pathlib3x.
Respondido 05 Jul 20, 15:07
-1
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.rmtree
sí rm -r
El 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 python file-io directory delete-file or haz tu propia pregunta.
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 comprobaros.path.isfile()
primero, o envolver en untry
. - ben crowellDesearí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 esFileNotFoundError
. - PedroA@ Jérôme creo
missing_ok=True
, adicional en 3.8 resuelve eso! - Felix