Python Programming

Recuperación eficiente de archivos de directorios en Python

Spread the love

Recuperar eficientemente todos los archivos dentro de un directorio es una tarea crucial en varios programas Python, particularmente aquellos que involucran manipulación del sistema de archivos, procesamiento de datos o automatización. Python proporciona varios métodos robustos para lograr esto, cada uno con sus propias ventajas y desventajas. Este artículo explora tres enfoques populares: os.listdir, os.walk y glob.glob, guiándote en la selección del método más apropiado para tus necesidades específicas.

Tabla de Contenido

os.listdir: Listado de Archivos en un Directorio Simple

La función os.listdir() ofrece la manera más simple de obtener una lista de todas las entradas (archivos y subdirectorios) dentro de un directorio especificado. Devuelve una lista de cadenas, cada una representando el nombre de un elemento dentro de ese directorio.


import os

def list_directory_files(directory):
  """Lista todos los archivos y directorios en un directorio dado.

  Args:
    directory: La ruta al directorio.

  Returns:
    Una lista de nombres de archivo (cadenas) y nombres de directorio en el directorio especificado. 
    Devuelve una lista vacía si el directorio está vacío o no existe.  
    Imprime un mensaje de error si no se encuentra el directorio.
  """
  try:
    return os.listdir(directory)
  except FileNotFoundError:
    print(f"Error: Directorio '{directory}' no encontrado.")
    return []

my_directory = "/path/to/your/directory"  # Reemplaza con la ruta de tu directorio
files_and_dirs = list_directory_files(my_directory)
print(files_and_dirs)

Ventajas: Simple y eficiente para listados de un solo directorio.

Desventajas: No recorre recursivamente los subdirectorios; proporciona solo nombres de archivo, no rutas completas.

os.walk: Recorrido Recursivo de Directorios

Para explorar recursivamente directorios y sus subdirectorios, os.walk() es la opción ideal. Produce una tupla de 3 elementos para cada directorio: (root, dirs, files). root es la ruta al directorio actual, dirs es una lista de nombres de subdirectorios, y files lista los nombres de archivo dentro de ese directorio.


import os

def get_all_files(directory):
  """Recupera recursivamente todos los archivos dentro de un directorio y sus subdirectorios.

  Args:
    directory: La ruta al directorio.

  Returns:
    Una lista de rutas de archivo completas (cadenas). Devuelve una lista vacía si el directorio está vacío o no existe.
    Imprime un mensaje de error si no se encuentra el directorio.
  """
  all_files = []
  try:
    for root, _, files in os.walk(directory):
      for file in files:
        all_files.append(os.path.join(root, file))
    return all_files
  except FileNotFoundError:
    print(f"Error: Directorio '{directory}' no encontrado.")
    return []

my_directory = "/path/to/your/directory"  # Reemplaza con la ruta de tu directorio
all_files = get_all_files(my_directory)
print(all_files)

Ventajas: Recorre recursivamente los subdirectorios, proporcionando rutas de archivo completas.

Desventajas: Ligeramente más complejo que os.listdir().

glob.glob: Selección de Archivos Basada en Patrones

La función glob.glob() ofrece una coincidencia de nombres de archivo flexible utilizando comodines de estilo shell. Esto es particularmente útil para seleccionar archivos basados en patrones específicos (por ejemplo, todos los archivos .txt, archivos que comienzan con «informe_»).


import glob
import os

def get_files_by_pattern(directory, pattern="*"):
    """Recupera archivos que coinciden con un patrón dentro de un directorio.

    Args:
      directory: La ruta al directorio.
      pattern: El patrón de nombre de archivo (el valor predeterminado es "*", que coincide con todos los archivos).

    Returns:
      Una lista de rutas de archivo completas (cadenas) que coinciden con el patrón.  
      Devuelve una lista vacía si no hay archivos que coincidan o si el directorio no existe.
      Imprime un mensaje de error si no se encuentra el directorio.
    """
    try:
        return glob.glob(os.path.join(directory, pattern))
    except FileNotFoundError:
        print(f"Error: Directorio '{directory}' no encontrado.")
        return []

my_directory = "/path/to/your/directory"  # Reemplaza con la ruta de tu directorio
txt_files = get_files_by_pattern(my_directory, "*.txt")
print(txt_files)
all_files = get_files_by_pattern(my_directory)
print(all_files)

Ventajas: Potentes capacidades de coincidencia de patrones.

Desventajas: Menos sencillo que os.listdir() para listados simples; no recorre recursivamente los subdirectorios a menos que se combine con os.walk().

Eligiendo el Método Adecuado

El método óptimo depende de tus requisitos específicos:

  • Para listados simples de un solo directorio, os.listdir() es suficiente.
  • Para el recorrido recursivo de directorios y subdirectorios, os.walk() es la mejor opción.
  • Para la recuperación selectiva de archivos usando patrones, glob.glob() proporciona la solución más eficiente.

Recuerda incorporar un manejo de errores apropiado (por ejemplo, FileNotFoundError) para un código robusto.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *