es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Preservando todos los subdirectorios al guardar un archivo – Python

Tengo una carpeta con varios subdirectorios y dentro de ellos hay archivos con diferentes extensiones como .jpg, .png, etc. Me gustaría extraer solo los archivos .jpg y realizar algunas tareas en ellos, como el recorte, etc. Luego, quiero guardar estos archivos “nuevos” (es decir, los recortados) en los subdirectorios de los que provienen. Sin embargo, no quiero que estos nuevos archivos se guarden en la misma carpeta de la que provienen. En cambio, quiero que se guarden en una carpeta diferente que contenga todos los mismos subdirectorios con los mismos nombres de los que provienen. Esta nueva carpeta solo debe contener los archivos recortados “nuevos”. He incluido una ilustración a continuación para explicar mejor mi pregunta.

He intentado lo siguiente:

for imgs in glob.iglob(self.Main_Folder + '//'**/*.jpg', recursive=True):
    Output_Folder = os.path.join(os.path.dirname(imgs), "cropped" + str(idx) + ".jpg")

Sin embargo, esto sobrescribe los archivos .jpg ubicados en sus subdirectorios en la carpeta principal (es decir, sobrescribe 1.jpg, 2.jpg, etc). ¡Cualquier ayuda en esto sería muy apreciada!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, puedes modificar tu código para primero crear los nuevos subdirectorios en la nueva carpeta y luego guardar las imágenes recortadas en esos subdirectorios. Aquí tienes un ejemplo de código:

    import os
    import glob
    from PIL import Image
    
    Main_Folder = '/ruta/a/la/carpeta/principal'
    New_Folder = '/ruta/a/la/nueva/carpeta'
    
    for imgs in glob.iglob(Main_Folder + '/**/*.jpg', recursive=True):
        # obtener la ruta del subdirectorio a partir de la ruta del archivo original
        sub_dir = os.path.dirname(os.path.relpath(imgs, Main_Folder))
        # crear la nueva ruta del subdirectorio en la nueva carpeta
        new_sub_dir = os.path.join(New_Folder, sub_dir)
        os.makedirs(new_sub_dir, exist_ok=True)
        # abrir la imagen usando la biblioteca Pillow
        with Image.open(imgs) as im:
            # realizar el recorte u otro procesamiento de imagen aquí
            cropped_im = im.crop((0, 0, 100, 100))
            # guardar la imagen recortada en el nuevo subdirectorio
            cropped_im.save(os.path.join(new_sub_dir, os.path.basename(imgs)))
    

    En este código, primero iteramos sobre todos los archivos .jpg en la Main_Folder. Para cada archivo, obtenemos la ruta del subdirectorio relativa a la Main_Folder usando os.path.relpath. Luego creamos una nueva ruta de subdirectorio en la New_Folder usando os.path.join y os.makedirs, asegurándonos de usar exist_ok=True para evitar errores si el subdirectorio ya existe. Luego abrimos la imagen original usando la biblioteca Pillow, realizamos cualquier procesamiento de imagen como recorte y guardamos la imagen recortada en el subdirectorio recién creado usando os.path.join y cropped_im.save. Esto asegura que los nuevos archivos se guarden en subdirectorios separados en la New_Folder y no en los mismos subdirectorios en la Main_Folder.

Comments are closed.