¿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 escrituraLeer 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.