Ir al contenido principal

Trabajando con archivos: apertura, lectura y escritura

Introducción

El manejo de archivos es una habilidad fundamental para cualquier programador, ya que permite almacenar y recuperar datos de forma persistente. En Python, trabajar con archivos es sorprendentemente sencillo gracias a sus funciones integradas y su sintaxis clara. Dominar estas operaciones te permitirá crear programas que guarden configuraciones, procesen datos o generen informes. En este artículo, exploraremos cómo abrir, leer y escribir archivos en Python, sentando las bases para el desarrollo de aplicaciones que puedan manejar datos persistentes.

Apertura de archivos

Para trabajar con un archivo en Python, primero debemos abrirlo. Esto se hace mediante la función open().

Sintaxis básica

archivo = open(ruta_archivo, modo)

Donde:

  • ruta_archivo: Es la ruta donde se encuentra el archivo (puede ser relativa o absoluta)
  • modo: Especifica cómo queremos abrir el archivo (lectura, escritura, etc.)

Modos de apertura

Python ofrece varios modos para abrir archivos:

Modo Descripción
'r' Lectura (predeterminado). Abre el archivo para leer; error si no existe.
'w' Escritura. Crea el archivo si no existe o lo trunca si existe.
'a' Anexar. Abre para escritura, creando el archivo si no existe; los datos se añaden al final.
'x' Creación exclusiva. Falla si el archivo ya existe.
'b' Modo binario (agregado a otros modos: 'rb', 'wb').
't' Modo texto (predeterminado, agregado a otros modos: 'rt', 'wt').
'+' Actualización (lectura y escritura, agregado a otros modos: 'r+', 'w+').

Ejemplos de apertura

# Abrir para lectura (modo predeterminado)
archivo_lectura = open("datos.txt", "r")

# Abrir para escritura (sobrescribe el contenido existente)
archivo_escritura = open("salida.txt", "w")

# Abrir para añadir contenido al final
archivo_anexar = open("registro.txt", "a")

# Abrir archivo binario para lectura
archivo_binario = open("imagen.jpg", "rb")

# Abrir para lectura y escritura
archivo_actualizar = open("configuracion.txt", "r+")

Cierre de archivos

Después de trabajar con un archivo, es fundamental cerrarlo para liberar recursos del sistema.

archivo = open("datos.txt", "r")
# Operaciones con el archivo...
archivo.close()  # Cerrar el archivo cuando ya no lo necesitamos

El patrón with (contexto)

La forma recomendada de trabajar con archivos es usando el patrón with, que garantiza que el archivo se cierre correctamente incluso si ocurren errores:

# Utilizando el patrón with (recomendado)
with open("datos.txt", "r") as archivo:
    # Operaciones con el archivo...
    contenido = archivo.read()
# Al salir del bloque with, el archivo se cierra automáticamente

Lectura de archivos

Python ofrece varios métodos para leer el contenido de un archivo.

Método read()

Lee todo el contenido del archivo como una cadena:

with open("ejemplo.txt", "r", encoding="utf-8") as archivo:
    contenido = archivo.read()
    print(contenido)

También puedes especificar cuántos caracteres leer:

with open("ejemplo.txt", "r") as archivo:
    primeros_50 = archivo.read(50)  # Lee los primeros 50 caracteres
    print(primeros_50)

Método readline()

Lee una línea del archivo cada vez:

with open("ejemplo.txt", "r") as archivo:
    primera_linea = archivo.readline()
    segunda_linea = archivo.readline()
    print(primera_linea)
    print(segunda_linea)

Método readlines()

Lee todas las líneas y las devuelve como una lista:

with open("ejemplo.txt", "r") as archivo:
    lineas = archivo.readlines()
    print(lineas)  # Lista donde cada elemento es una línea del archivo

Iteración directa

La forma más elegante y eficiente de recorrer un archivo línea por línea:

with open("ejemplo.txt", "r") as archivo:
    for linea in archivo:
        print(linea.strip())  # strip() elimina espacios en blanco y saltos de línea

Escritura en archivos

Para escribir en archivos, utilizamos los métodos write() y writelines().

Método write()

Escribe una cadena en el archivo:

with open("salida.txt", "w", encoding="utf-8") as archivo:
    archivo.write("Hola, mundo!\n")
    archivo.write("Esta es la segunda línea.")

Método writelines()

Escribe una lista de cadenas en el archivo:

lineas = ["Primera línea\n", "Segunda línea\n", "Tercera línea\n"]
with open("salida.txt", "w") as archivo:
    archivo.writelines(lineas)

Ten en cuenta que writelines() no añade automáticamente saltos de línea, debes incluirlos explícitamente si los necesitas.

Posicionamiento en archivos

A veces necesitamos leer o escribir en posiciones específicas del archivo.

Método seek()

Mueve el cursor a una posición determinada:

with open("datos.txt", "r") as archivo:
    archivo.seek(10)  # Mueve el cursor a la posición 10
    datos = archivo.read(5)  # Lee 5 caracteres desde la posición 10

Método tell()

Devuelve la posición actual del cursor:

with open("datos.txt", "r") as archivo:
    posicion = archivo.tell()  # Obtiene la posición actual
    print(f"Posición actual: {posicion}")

Manejo de archivos con codificación

Cuando trabajamos con textos que contienen caracteres especiales (como tildes, ñ, etc.), es importante especificar la codificación:

# Lectura con codificación UTF-8
with open("texto_español.txt", "r", encoding="utf-8") as archivo:
    contenido = archivo.read()
    print(contenido)

# Escritura con codificación UTF-8
with open("salida_español.txt", "w", encoding="utf-8") as archivo:
    archivo.write("¡Hola, cómo estás! Ñandú.")

Ejemplos prácticos

Ejemplo 1: Contar líneas, palabras y caracteres

def contar_estadisticas(nombre_archivo):
    lineas = 0
    palabras = 0
    caracteres = 0
    
    with open(nombre_archivo, "r", encoding="utf-8") as archivo:
        for linea in archivo:
            lineas += 1
            caracteres += len(linea)
            palabras += len(linea.split())
    
    return lineas, palabras, caracteres

# Uso de la función
archivo_texto = "ejemplo.txt"
l, p, c = contar_estadisticas(archivo_texto)
print(f"El archivo {archivo_texto} tiene:")
print(f"- {l} líneas")
print(f"- {p} palabras")
print(f"- {c} caracteres")

Ejemplo 2: Copiar un archivo

def copiar_archivo(origen, destino):
    try:
        with open(origen, "r", encoding="utf-8") as archivo_origen:
            contenido = archivo_origen.read()
            
        with open(destino, "w", encoding="utf-8") as archivo_destino:
            archivo_destino.write(contenido)
            
        print(f"Se copió el contenido de {origen} a {destino} correctamente.")
    except FileNotFoundError:
        print(f"Error: No se encontró el archivo {origen}.")
    except Exception as e:
        print(f"Ocurrió un error: {e}")

# Uso de la función
copiar_archivo("original.txt", "copia.txt")

Ejemplo 3: Registrar información en un archivo de log

from datetime import datetime

def registrar_evento(mensaje):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    with open("registro.log", "a", encoding="utf-8") as log:
        log.write(f"[{timestamp}] {mensaje}\n")

# Uso de la función
registrar_evento("Aplicación iniciada")
registrar_evento("Usuario ha iniciado sesión")
registrar_evento("Operación completada con éxito")

Resumen

El manejo de archivos en Python es una habilidad esencial que permite crear programas capaces de almacenar y procesar datos de forma persistente. Hemos aprendido cómo abrir archivos en diferentes modos, leer su contenido de varias formas, escribir información y posicionarnos en puntos específicos del archivo. El patrón with nos garantiza un cierre adecuado de los archivos, evitando problemas de recursos. Con estas herramientas, podemos desarrollar aplicaciones que trabajen eficientemente con datos almacenados en el sistema de archivos. En el próximo artículo, exploraremos cómo gestionar rutas y directorios, lo que complementará nuestro conocimiento sobre el manejo de archivos en Python.