Traté de usar shutil para eliminar un directorio y todos los archivos contenidos, de la siguiente manera:
import shutil from os.path import exists if exists(path_dir): shutil.rmtree(path_dir)Desafortunadamente, mi solución no funciona y arroja el siguiente error:
FileNotFoundError: [Errno 2] No such file or directory: '._image1.jpg' Una búsqueda rápida mostró que no soy el único que tiene este problema. Según tengo entendido, la función rmtree es equivalente al comando de shell rm -Rf $DIR , pero este no parece ser el caso.
ps con fines de reconstrucción. Cree un enlace simbólico, por ejemplo, usando ln -s /path/to/original /path/to/link
De ¿Cómo eliminar un directorio que incluye todos sus archivos en python?
# function that deletes all files and then folder import glob, os def del_folder(dir_name): dir_path = os.getcwd() + "\{}".format(dir_name) try: os.rmdir(dir_path) # remove the folder except: print("OSError") # couldn't remove the folder because we have files inside it finally: # now iterate through files in that folder and delete them one by one and delete the folder at the end try: for filepath in os.listdir(dir_path): os.remove(dir_path + "\{}".format(filepath)) os.rmdir(dir_path) print("folder is deleted") except: print("folder is not there") También puede simplemente usar el indicador ignore_errors con shutil.rmtree() .
shutil.rmtree('/folder_name', ignore_errors=True) Eso debería eliminar un directorio con contenido de archivo.
Probablemente esté en Mac OSX y su directorio esté, al menos parcialmente, en un sistema de archivos que no sea de Mac (es decir, no sea HFS+). En esos, los controladores del sistema de archivos de Mac crean automáticamente archivos complementarios binarios con el prefijo ._ para registrar los llamados atributos extendidos (explicados en https://apple.stackexchange.com/questions/14980/why-are-dot-underscore-files-created -y-cómo-puedo-evitar-los , pero también se ilustra a continuación).
rmtree en sistemas que no admiten descriptores de archivos en os.scandir (como Mac OSX) ahora crea de manera insegura una lista de entradas y luego las desvincula una por una (creando una condición de carrera conocida: https://github.com/python/ cpython/blob/908fd691f96403a3c30d85c17dd74ed1f26a60fd/Lib/shutil.py#L592-L621 ). Desafortunadamente, dos comportamientos separados hacen que esta condición sea verdadera cada vez:
test.txt ), el metaarchivo ( ._test.txt ) se elimina simultáneamente. Por lo tanto, el archivo de atributos extendidos faltará cuando sea su turno y arrojará el FileNotFoundError que está experimentando.
Creo que este error se solucionaría mejor con cpython#14064 , cuyo objetivo es ignorar FileNotFoundError s en rmtree en general.
Mientras tanto, puede ignorar los errores de desvinculación en esos metaarchivos con onerror :
def ignore_extended_attributes(func, filename, exc_info): is_meta_file = os.path.basename(filename).startswith("._") if not (func is os.unlink and is_meta_file): raise shutil.rmtree(path_dir, onerror=ignore_extended_attributes) Para ilustrar, puede crear una pequeña imagen de disco ExFAT y montarla en /Volumes/Untitled con los comandos
hdiutil create -size 5m -fs exfat test.dmg hdiutil attach test.dmg # mounts at /Volumes/Untitled cd /Volumes/Untitled mkdir test # create a directory to remove cd test touch test.txt open test.txt # open the test.txt file in the standard editor Con solo abrir el archivo en el editor de texto estándar, se crea un archivo de atributos extendidos ._test.txt y se registra la última hora de acceso en él:
/Volumes/Untitled/test $ ls -a . .. ._test.txt test.txt /Volumes/Untitled/test $ xattr test.txt com.apple.lastuseddate#PSEl problema es que al desvincular el archivo original también se desvincula automáticamente el archivo complementario.
/Volumes/Untitled/test $ rm test.txt /Volumes/Untitled/test $ ls -a . ..