Saltar a contenido

Buscar archivos de imágenes

Si hemos instalado Pillow, siguiendo las instrucciones del capítulo anterior, podemos comprobar la versión con:

>>> import PIL
>>> PIL.__version__
    '11.1.0'

Pillow es un proyecto derivado de otro anterior, llamado PIL. Muchos términos se han mantenido sin ser modificados.

Vamos a usar Pillow para hacer una búsqueda de archivos de imágenes en nuestro equipo, y mostrar su resolución.

Buscar archivos en disco

Comencemos por examinar un directorio:

Directorio.py
1
2
3
4
import os
carpeta = '/Users/usuario/Documents/'
for archivo in os.listdir(carpeta):
    print(archivo)

Lo que muestra una lista de ficheros en esa carpeta. Podemos mostrarlos con su ruta completa mediante:

print(carpeta+archivo)

... aunque tendremos que añadir manualmente la barra final para que esto funcione:

carpeta = '/Users/usuario/Documents/'

Vemos que el módulo estándar os cuenta con una función listdir(x) que devuelve una lista de ficheros en la carpeta x.

Buscar archivos de forma recursiva

Si uno de los archivos encontrados es una carpeta, vamos a interrumpir temporalmente el proceso de la carpeta actual, y examinar esa subcarpeta:

Directorio2.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import os

def buscar(carpeta):
    for archivo in os.listdir(carpeta):

        # Obtener la ruta completa del archivo

        if carpeta[-1] == "/":
            archivo = carpeta+archivo
        else:
            archivo = carpeta+"/"+archivo

        # Si es una subcarpeta, examinarla

        if os.path.isdir(archivo):
            buscar(archivo)
        else:
            print(archivo)

carpeta = '/Users/usuario/Documents/'
buscar(carpeta)

La función os.path.isdir(x) examina la entrada x en un directorio y devuelve True si se trata de una carpeta. En ese caso, hacemos una nueva llamada a buscar() para examinar la carpeta encontrada.

Con este ejemplo, vemos que una función puede llamarse a si mismo de forma recursiva. Es una técnica un poco peligrosa, porque la función puede estar autoinvocándose de forma indefinida hasta colapsar el sistema, metiéndose en un bucle indefinidamente. Cuando hagamos uso de estas llamadas recursivas, debemos estar seguros de que en algún momento se interrumpirá la recursión.

Seleccionar archivos de imágenes

Al procesar un archivo, vamos a intentar abrirlo con Pillow. Si no es un archivo de imagen (png, jpeg, etc) se producirá un error, y con un bloque try...axcept lo ignoramos.

En el caso de que consigamos abrir el fichero, mostramos su nombre y usamos el método close() para borrarlo de la memoria RAM.

Para hacer uso del Pillow, tenemos que importar el módulo Image:

from PIL import Image

El programa queda así:

ListaImagenes.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import os
from PIL import Image

def buscar(carpeta):
    for archivo in os.listdir(carpeta):
        if carpeta[-1] == "/":
            archivo = carpeta+archivo
        else:
            archivo = carpeta+"/"+archivo

        if os.path.isdir(archivo):
            buscar(archivo)
        else:
            try:
                imagen=Image.open(archivo)
                print(archivo)
                imagen.close()
            except:
                pass

carpeta = '/Users/usuario/Documents/'
buscar(carpeta)

Añadir información sobre cada imagen

Vamos a utilizar las capacidades de Pillow para averiguar la resolución de las imágenes:

ListaImagenes2.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os
from PIL import Image

def buscar(carpeta):
    for archivo in os.listdir(carpeta):
        if carpeta[-1] == "/":
            archivo = carpeta+archivo
        else:
            archivo = carpeta+"/"+archivo

        if os.path.isdir(archivo):
            buscar(archivo)
        else:
            try:
                imagen=Image.open(archivo)
                tamaño=imagen.size
                print(f"{archivo} ({tamaño[0]}x{tamaño[1]})")
                imagen.close()
            except:
                pass

carpeta = '/Users/usuario/Documents/'
buscar(carpeta)

La función Image.open() crea un objeto en memoria que tiene una propiedad size. Consiste en una tupla de dos elementos, ancho y alto de la imagen, medido en número de pixels (puntos de color).

Con esto obtenemos en la consola una lista de archivos de imagen, con su resolución:

Documents/imagenes/Imagen01.png (600x270)
Documents/imagenes/Imagen03.png (600x288)
Documents/imagenes/Imagen02.png (600x355)
Documents/imagenes/Imagen10.png (600x316)
Documents/imagenes/Imagen04.png (600x321)
Documents/imagenes/Imagen09.png (1002x328)
Documents/imagenes/Imagen08.png (600x216)
...