04Sep

Cómo operar con listados de archivos, directorios, filtrar y encontrar conjuntos de archivos

El árbol de archivos

Comprobar si es un archivo o un directorio

Para comprobar si una ruta almacenada en una variable es un archivo o por el contrario es un directorio podemos usar el método isfile del paquete os de Python.

import os

file_path = '/tmp/fotogragia.jpg'

if os.path.isfile(file_path):
    print(u"Es un archivo!")
else:
    print("Es un directorio!")

También podemos hacer uso directo de os.path.isdir para detectar si es un directorio.

Obtener los archivos y sub-directorios de un directorio

Si tenemos una variable con un directorio del sistema, podemos obtener una lista con todos los archivos y sub-directorios que incluye como en el siguiente ejemplo:

import os

nombre_carpeta = '/home/urodoz/ftp_data/'

lista_contenido = os.listdir(nombre_carpeta)
print(lista_contenido)
# Ejemplo de salida: ['subcarpeta1', 'subcarpeta2', 'archivo1.txt', 'archivo2.jpg']

Filtrar archivos de un directorio

Si queremos obtener un subconjunto de los archivos de un directorio que cumplan cierto patrón podemos usar la librería fnmatch.

En el siguiente ejemplo obtener todos los archivos txt de un directorio:

import fnmatch
import os

archivos_finales = []
for file in os.listdir("/tmp"):
    if fnmatch.fnmatch(file, "*.txt"):
        archivos_finales.append(file)

# Tenemos todos los archivos filtrados en la lista archivos_finales

Obtener archivos de forma recursiva

Si necesitamos obtener todos los archivos que cumplan cierto patrón de forma recursiva en un conjunto de carpetas y subcarpetas. Podemos usar os.walk para recorrer todas los subdirectorios de un directorio dado.

En el siguiente ejemplo obtenemos todos los archivos JPG de un conjunto de subdirectorios:0

import os
import fnmatch

# En la variable archivos_finales almacenaremos los archivos JPG
archivos_finales = []
for root, dirnames, filenames in os.walk(source):
    for filename in filenames:
        if fnmatch.fnmatch(file, "*.jpg"):
            archivos_finales.append(file)
Leave a comment