¿Cómo eliminar un archivo o carpeta en Python?
¿Cómo eliminar un archivo o carpeta en Python?
Respuestas:
os.remove() elimina un archivo
os.rmdir() elimina un directorio vacío
shutil.rmtree() elimina un directorio y todos sus contenidos.
PathLos objetos del pathlibmódulo Python 3.4+ también exponen estos métodos de instancia:
pathlib.Path.unlink() elimina un archivo o enlace simbólico.
pathlib.Path.rmdir() elimina un directorio vacío
os.remove()lanza una excepción, por lo que puede ser necesario verificar os.path.isfile()primero o envolver en un try.
os.remove()si un archivo no existe es FileNotFoundError.
os.remove() Toma múltiples argumentos para eliminar múltiples archivos, o lo llama cada vez para cada 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()
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.
os.path.isfile("/path/to/file")exception 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)
#!/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))
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
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))
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))
remove(path);llamada ISO C.
os.path.islink(file_path): un error, debería seros.path.islink(path):
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()
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.
¿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)
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
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.
rmtree(directory_path)funciona en python 3.6.6 pero no en python 3.5.2: rmtree(str(directory_path)))allí lo necesita .
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)
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')
shutil.rmtreeNo se supone que sea asíncrono. Sin embargo, puede parecer que está en Windows con los escáneres de virus que interfieren.
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.
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.
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
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))
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.
shutil.rmtree()elimina no solo el directorio sino también su contenido.
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)
subprocesspara esto. shutil.rmtreefunciona rm -rbien, con la ventaja adicional de trabajar en Windows.