Manejo de Archivos en Python: Leer, Escribir y Modificar

👤 Admin 📅 9 de noviembre, 2025 ⏱ 17 min 🏷 Python Intermedio

¿Por Qué Manejar Archivos?

El manejo de archivos es esencial para persistir datos, configurar aplicaciones, procesar logs y trabajar con datos externos. Python hace esto muy fácil.

Abrir Archivos con open()

La función open() abre un archivo y retorna un objeto de archivo:

# Sintaxis básica
archivo = open('nombre_archivo.txt', 'modo')

# Modos comunes:
# 'r' - Lectura (read) - por defecto
# 'w' - Escritura (write) - sobrescribe el archivo
# 'a' - Agregar (append) - agrega al final
# 'x' - Crear - crea archivo nuevo (error si existe)
# 'b' - Modo binario
# 't' - Modo texto - por defecto
# '+' - Lectura y escritura

Leer Archivos

Método 1: read()

# Leer todo el contenido
archivo = open('documento.txt', 'r')
contenido = archivo.read()
print(contenido)
archivo.close()

# Leer cantidad específica de caracteres
archivo = open('documento.txt', 'r')
primeros_100 = archivo.read(100)
print(primeros_100)
archivo.close()

Método 2: readline()

# Leer línea por línea
archivo = open('documento.txt', 'r')
linea1 = archivo.readline()
linea2 = archivo.readline()
print(linea1)
print(linea2)
archivo.close()

Método 3: readlines()

# Leer todas las líneas en una lista
archivo = open('documento.txt', 'r')
lineas = archivo.readlines()
for linea in lineas:
    print(linea.strip())  # strip() quita \n
archivo.close()

Método 4: Iterar (Más Eficiente)

# Forma más eficiente y pythonica
archivo = open('documento.txt', 'r')
for linea in archivo:
    print(linea.strip())
archivo.close()

Escribir en Archivos

Modo 'w' - Sobrescribir

# Crea nuevo archivo o sobrescribe existente
archivo = open('salida.txt', 'w')
archivo.write("Primera línea\n")
archivo.write("Segunda línea\n")
archivo.close()

# Escribir múltiples líneas
lineas = ["Línea 1\n", "Línea 2\n", "Línea 3\n"]
archivo = open('salida.txt', 'w')
archivo.writelines(lineas)
archivo.close()

Modo 'a' - Agregar

# Agrega al final sin borrar contenido existente
archivo = open('registro.txt', 'a')
archivo.write("Nueva entrada\n")
archivo.close()

Context Manager - with Statement

La mejor práctica es usar with que cierra automáticamente el archivo:

# Lectura con context manager
with open('documento.txt', 'r') as archivo:
    contenido = archivo.read()
    print(contenido)
# El archivo se cierra automáticamente

# Escritura con context manager
with open('salida.txt', 'w') as archivo:
    archivo.write("Contenido\n")
    archivo.write("Más contenido\n")

# Múltiples archivos
with open('entrada.txt', 'r') as entrada, open('salida.txt', 'w') as salida:
    for linea in entrada:
        salida.write(linea.upper())

Manejo de Excepciones

try:
    with open('archivo_inexistente.txt', 'r') as archivo:
        contenido = archivo.read()
except FileNotFoundError:
    print("El archivo no existe")
except PermissionError:
    print("No tienes permisos para acceder al archivo")
except Exception as e:
    print(f"Error: {e}")

Trabajar con Rutas

import os

# Ruta actual
ruta_actual = os.getcwd()
print(f"Directorio actual: {ruta_actual}")

# Verificar si archivo existe
if os.path.exists('archivo.txt'):
    print("El archivo existe")

# Crear directorio
if not os.path.exists('nuevo_directorio'):
    os.mkdir('nuevo_directorio')

# Listar archivos en directorio
archivos = os.listdir('.')
for archivo in archivos:
    print(archivo)

# Ruta completa
ruta_completa = os.path.join('carpeta', 'archivo.txt')
print(ruta_completa)

# Eliminar archivo
# os.remove('archivo_temporal.txt')

Trabajar con CSV

import csv

# Escribir CSV
with open('datos.csv', 'w', newline='') as archivo:
    escritor = csv.writer(archivo)
    escritor.writerow(['Nombre', 'Edad', 'Ciudad'])
    escritor.writerow(['Ana', '25', 'Madrid'])
    escritor.writerow(['Luis', '30', 'Barcelona'])

# Leer CSV
with open('datos.csv', 'r') as archivo:
    lector = csv.reader(archivo)
    for fila in lector:
        print(fila)

# Leer CSV como diccionario
with open('datos.csv', 'r') as archivo:
    lector = csv.DictReader(archivo)
    for fila in lector:
        print(f"{fila['Nombre']} tiene {fila['Edad']} años")

# Escribir diccionarios a CSV
datos = [
    {'Nombre': 'Ana', 'Edad': 25, 'Ciudad': 'Madrid'},
    {'Nombre': 'Luis', 'Edad': 30, 'Ciudad': 'Barcelona'}
]

with open('datos.csv', 'w', newline='') as archivo:
    campos = ['Nombre', 'Edad', 'Ciudad']
    escritor = csv.DictWriter(archivo, fieldnames=campos)
    escritor.writeheader()
    escritor.writerows(datos)

Trabajar con JSON

import json

# Datos Python
datos = {
    'nombre': 'Ana',
    'edad': 25,
    'ciudad': 'Madrid',
    'hobbies': ['leer', 'programar', 'viajar']
}

# Escribir JSON
with open('datos.json', 'w') as archivo:
    json.dump(datos, archivo, indent=4)

# Leer JSON
with open('datos.json', 'r') as archivo:
    datos_leidos = json.load(archivo)
    print(datos_leidos)
    print(datos_leidos['nombre'])  # Ana

# Convertir a string JSON
json_string = json.dumps(datos, indent=2)
print(json_string)

# Convertir string JSON a Python
datos_desde_string = json.loads(json_string)
print(datos_desde_string)

Archivos Binarios

# Leer archivo binario (imagen, pdf, etc)
with open('imagen.jpg', 'rb') as archivo:
    contenido_binario = archivo.read()
    print(f"Tamaño: {len(contenido_binario)} bytes")

# Copiar archivo binario
with open('imagen.jpg', 'rb') as origen:
    with open('copia_imagen.jpg', 'wb') as destino:
        destino.write(origen.read())

Ejemplos Prácticos

1. Contador de Palabras

def contar_palabras(nombre_archivo):
    try:
        with open(nombre_archivo, 'r', encoding='utf-8') as archivo:
            contenido = archivo.read()
            palabras = contenido.split()
            return len(palabras)
    except FileNotFoundError:
        return "Archivo no encontrado"

print(f"Total de palabras: {contar_palabras('documento.txt')}")

2. Sistema de Registro (Log)

from datetime import datetime

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

registrar_evento("Aplicación iniciada")
registrar_evento("Usuario conectado")
registrar_evento("Error en proceso X")

3. Procesador de Configuración

def leer_configuracion(archivo_config):
    config = {}
    try:
        with open(archivo_config, 'r') as archivo:
            for linea in archivo:
                linea = linea.strip()
                if linea and not linea.startswith('#'):
                    clave, valor = linea.split('=')
                    config[clave.strip()] = valor.strip()
    except FileNotFoundError:
        print("Archivo de configuración no encontrado")
    return config

# Archivo config.txt:
# host=localhost
# puerto=8080
# debug=true

config = leer_configuracion('config.txt')
print(config)  # {'host': 'localhost', 'puerto': '8080', 'debug': 'true'}

4. Buscar y Reemplazar

def buscar_reemplazar(archivo, buscar, reemplazar):
    with open(archivo, 'r') as f:
        contenido = f.read()
    
    nuevo_contenido = contenido.replace(buscar, reemplazar)
    
    with open(archivo, 'w') as f:
        f.write(nuevo_contenido)
    
    return f"Reemplazadas {contenido.count(buscar)} ocurrencias"

print(buscar_reemplazar('documento.txt', 'Python', 'JavaScript'))

5. Comparar Archivos

def archivos_iguales(archivo1, archivo2):
    try:
        with open(archivo1, 'r') as f1, open(archivo2, 'r') as f2:
            return f1.read() == f2.read()
    except FileNotFoundError:
        return False

if archivos_iguales('archivo1.txt', 'archivo2.txt'):
    print("Los archivos son idénticos")
else:
    print("Los archivos son diferentes")

Encoding (Codificación)

# Siempre especifica encoding para archivos de texto
with open('archivo.txt', 'r', encoding='utf-8') as archivo:
    contenido = archivo.read()

# Manejar errores de encoding
with open('archivo.txt', 'r', encoding='utf-8', errors='ignore') as archivo:
    contenido = archivo.read()

Conclusión

El manejo de archivos es una habilidad fundamental en programación. Python hace que sea fácil leer, escribir y manipular archivos de todo tipo. Usa siempre with para asegurar que los archivos se cierren correctamente y maneja excepciones para código robusto.