Manejo de Archivos
Aprende a leer, escribir y manipular archivos en Python, incluyendo archivos de texto, binarios, CSV, JSON y más.
Cristian Escalante
Última actualización: 21 de mayo de 2025
Manejo de Archivos en Python
La capacidad de trabajar con archivos es fundamental en programación. Python ofrece funciones integradas para leer, escribir y manipular archivos de manera sencilla y eficiente. En esta lección, aprenderemos a trabajar con diferentes tipos de archivos, desde simples archivos de texto hasta formatos estructurados como CSV y JSON.
Operaciones básicas con archivos
Abrir y cerrar archivos
En Python, utilizamos la función open()
para abrir un archivo. Esta función devuelve un objeto de archivo que podemos utilizar para leer o escribir datos.
# Sintaxis básica: open(ruta_archivo, modo)
archivo = open("ejemplo.txt", "r") # Abrir en modo lectura
# Operaciones con el archivo...
archivo.close() # Importante: cerrar el archivo cuando terminemos
Modos de apertura de archivos
Python ofrece varios modos para abrir archivos:
Modo | Descripción |
---|---|
"r" | Lectura (predeterminado). El archivo debe existir. |
"w" | Escritura. Crea el archivo si no existe, o lo trunca si existe. |
"a" | Añadir. Crea el archivo si no existe, o añade al final si existe. |
"x" | Creación exclusiva. Falla si el archivo ya existe. |
"b" | Modo binario (se añade a otros modos: "rb" , "wb" , etc.) |
"t" | Modo texto (predeterminado, se añade a otros modos: "rt" , "wt" , etc.) |
"+" | Actualización (lectura y escritura, se añade a otros modos: "r+" , "w+" , etc.) |
Uso del contexto with
(recomendado)
La mejor práctica para trabajar con archivos es usar el administrador de contexto with
, que se encarga automáticamente de cerrar el archivo:
# Forma recomendada de abrir archivos
with open("ejemplo.txt", "r") as archivo:
# Operaciones con el archivo...
contenido = archivo.read()
print(contenido)
# El archivo se cierra automáticamente al salir del bloque with
Lectura de archivos
Python ofrece varios métodos para leer el contenido de un archivo:
Leer todo el contenido
with open("ejemplo.txt", "r") as archivo:
contenido = archivo.read() # Lee todo el archivo como una cadena
print(contenido)
Leer línea por línea
with open("ejemplo.txt", "r") as archivo:
# Leer la primera línea
primera_linea = archivo.readline()
print(primera_linea)
# Leer la siguiente línea
segunda_linea = archivo.readline()
print(segunda_linea)
Leer todas las líneas
with open("ejemplo.txt", "r") as archivo:
# Leer todas las líneas en una lista
lineas = archivo.readlines()
for linea in lineas:
print(linea, end="") # end="" evita doble salto de línea
Iterar sobre el archivo
La forma más eficiente de leer un archivo línea por línea, especialmente para archivos grandes:
with open("ejemplo.txt", "r") as archivo:
for linea in archivo:
print(linea, end="")
Escritura de archivos
Escribir texto
with open("nuevo.txt", "w") as archivo:
archivo.write("Hola, mundo!\n")
archivo.write("Esta es la segunda línea.\n")
Escribir múltiples líneas
lineas = ["Primera línea\n", "Segunda línea\n", "Tercera línea\n"]
with open("lineas.txt", "w") as archivo:
archivo.writelines(lineas)
Añadir a un archivo existente
with open("log.txt", "a") as archivo:
archivo.write("Nuevo registro añadido\n")
Trabajar con rutas de archivos
El módulo os.path
proporciona funciones para trabajar con rutas de archivos de manera compatible con diferentes sistemas operativos:
import os.path
# Comprobar si un archivo existe
existe = os.path.exists("archivo.txt")
print(f"¿El archivo existe? {existe}")
# Obtener la ruta absoluta
ruta_absoluta = os.path.abspath("archivo.txt")
print(f"Ruta absoluta: {ruta_absoluta}")
# Obtener el directorio y el nombre del archivo
directorio, nombre_archivo = os.path.split(ruta_absoluta)
print(f"Directorio: {directorio}")
print(f"Nombre del archivo: {nombre_archivo}")
# Obtener la extensión del archivo
nombre_base, extension = os.path.splitext(nombre_archivo)
print(f"Nombre base: {nombre_base}")
print(f"Extensión: {extension}")
El módulo pathlib
(Python 3.4+)
Para una manipulación más orientada a objetos de las rutas, podemos usar el módulo pathlib
:
from pathlib import Path
# Crear un objeto Path
ruta = Path("carpeta/subcarpeta/archivo.txt")
# Obtener información sobre la ruta
print(ruta.name) # archivo.txt
print(ruta.stem) # archivo
print(ruta.suffix) # .txt
print(ruta.parent) # carpeta/subcarpeta
print(ruta.exists()) # False (a menos que exista)
# Crear directorios
ruta.parent.mkdir(parents=True, exist_ok=True)
# Operaciones con rutas
nuevo_archivo = ruta.parent / "otro_archivo.txt"
print(nuevo_archivo) # carpeta/subcarpeta/otro_archivo.txt
Manejo de archivos de texto con codificación
Para manejar correctamente archivos de texto con caracteres especiales (como acentos), es importante especificar la codificación:
# Escribir con codificación UTF-8
with open("acentos.txt", "w", encoding="utf-8") as archivo:
archivo.write("¡Hola, cómo estás! Esto es español.\n")
# Leer con la misma codificación
with open("acentos.txt", "r", encoding="utf-8") as archivo:
contenido = archivo.read()
print(contenido)
Trabajar con archivos CSV
Los archivos CSV (Comma-Separated Values) son muy comunes para almacenar datos tabulares. Python proporciona el módulo csv
para trabajar con ellos:
Leer un archivo CSV
import csv
with open("datos.csv", "r", newline="", encoding="utf-8") as archivo:
lector_csv = csv.reader(archivo)
# Leer la cabecera
cabecera = next(lector_csv)
print(f"Columnas: {cabecera}")
# Leer los datos
for fila in lector_csv:
print(fila)
Leer un CSV como diccionario
import csv
with open("datos.csv", "r", newline="", encoding="utf-8") as archivo:
lector_csv = csv.DictReader(archivo)
for fila in lector_csv:
print(f"Nombre: {fila['nombre']}, Edad: {fila['edad']}")
Escribir un archivo CSV
import csv
datos = [
["Nombre", "Edad", "Ciudad"],
["Ana", "28", "Madrid"],
["Carlos", "35", "Barcelona"],
["Elena", "42", "Valencia"]
]
with open("personas.csv", "w", newline="", encoding="utf-8") as archivo:
escritor_csv = csv.writer(archivo)
# Escribir varias filas a la vez
escritor_csv.writerows(datos)
Escribir un CSV desde diccionarios
import csv
datos = [
{"nombre": "Ana", "edad": 28, "ciudad": "Madrid"},
{"nombre": "Carlos", "edad": 35, "ciudad": "Barcelona"},
{"nombre": "Elena", "edad": 42, "ciudad": "Valencia"}
]
with open("personas_dict.csv", "w", newline="", encoding="utf-8") as archivo:
campos = ["nombre", "edad", "ciudad"]
escritor_csv = csv.DictWriter(archivo, fieldnames=campos)
escritor_csv.writeheader() # Escribir la cabecera
escritor_csv.writerows(datos) # Escribir los datos
Trabajar con archivos JSON
JSON (JavaScript Object Notation) es un formato muy popular para intercambiar datos. Python proporciona el módulo json
para trabajar con este formato:
Leer un archivo JSON
import json
with open("datos.json", "r", encoding="utf-8") as archivo:
datos = json.load(archivo)
print(f"Nombre: {datos['nombre']}")
print(f"Edad: {datos['edad']}")
print(f"Ciudades visitadas: {', '.join(datos['ciudades_visitadas'])}")
Escribir un archivo JSON
import json
datos = {
"nombre": "Ana García",
"edad": 28,
"casada": False,
"hijos": None,
"ciudades_visitadas": ["Madrid", "Barcelona", "París", "Londres"],
"direccion": {
"calle": "Calle Principal",
"numero": 123,
"ciudad": "Madrid",
"codigo_postal": "28001"
}
}
with open("persona.json", "w", encoding="utf-8") as archivo:
# indent=2 para formatear el JSON con indentación
json.dump(datos, archivo, indent=2, ensure_ascii=False)
Trabajar con archivos binarios
Para trabajar con archivos binarios (como imágenes, archivos de audio, etc.), usamos el modo binario ("b"
):
Leer un archivo binario
with open("imagen.jpg", "rb") as archivo:
contenido = archivo.read()
print(f"Tamaño del archivo: {len(contenido)} bytes")
print(f"Primeros 10 bytes: {contenido[:10]}")
Escribir un archivo binario
# Copiar un archivo binario
with open("imagen_original.jpg", "rb") as archivo_origen:
contenido = archivo_origen.read()
with open("imagen_copia.jpg", "wb") as archivo_destino:
archivo_destino.write(contenido)
Manejo de excepciones con archivos
Es importante manejar posibles errores al trabajar con archivos:
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"Ocurrió un error: {e}")
Trabajar con directorios
Listar archivos y directorios
import os
# Listar todos los archivos y directorios en el directorio actual
for elemento in os.listdir("."):
if os.path.isfile(elemento):
print(f"Archivo: {elemento}")
elif os.path.isdir(elemento):
print(f"Directorio: {elemento}")
Crear y eliminar directorios
import os
import shutil
# Crear un directorio
os.mkdir("nueva_carpeta")
# Crear directorios anidados
os.makedirs("carpeta/subcarpeta/subsubcarpeta", exist_ok=True)
# Eliminar un directorio vacío
os.rmdir("nueva_carpeta")
# Eliminar un directorio y su contenido
shutil.rmtree("carpeta")
Ejemplos prácticos
Ejemplo 1: Contador de palabras
def contar_palabras(ruta_archivo):
try:
with open(ruta_archivo, "r", encoding="utf-8") as archivo:
contenido = archivo.read()
palabras = contenido.split()
return len(palabras)
except FileNotFoundError:
print(f"El archivo {ruta_archivo} no existe.")
return 0
# Uso
num_palabras = contar_palabras("ejemplo.txt")
print(f"El archivo contiene {num_palabras} palabras.")
Ejemplo 2: Registro de actividades (log)
import datetime
def registrar_actividad(mensaje):
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open("actividades.log", "a", encoding="utf-8") as archivo:
archivo.write(f"[{timestamp}] {mensaje}\n")
# Uso
registrar_actividad("Inicio del programa")
# ... código del programa ...
registrar_actividad("Fin del programa")
Ejemplo 3: Procesamiento de un archivo CSV
import csv
def calcular_promedio_edades(ruta_archivo):
total_edad = 0
contador = 0
with open(ruta_archivo, "r", newline="", encoding="utf-8") as archivo:
lector_csv = csv.DictReader(archivo)
for fila in lector_csv:
try:
edad = int(fila["edad"])
total_edad += edad
contador += 1
except (ValueError, KeyError):
continue
if contador > 0:
return total_edad / contador
else:
return 0
# Uso
promedio = calcular_promedio_edades("personas.csv")
print(f"La edad promedio es: {promedio:.2f} años")
Ejemplo 4: Convertir CSV a JSON
import csv
import json
def csv_a_json(archivo_csv, archivo_json):
datos = []
with open(archivo_csv, "r", newline="", encoding="utf-8") as archivo:
lector_csv = csv.DictReader(archivo)
for fila in lector_csv:
datos.append(fila)
with open(archivo_json, "w", encoding="utf-8") as archivo:
json.dump(datos, archivo, indent=2, ensure_ascii=False)
# Uso
csv_a_json("datos.csv", "datos.json")
Ejemplo 5: Buscar texto en archivos
import os
def buscar_en_archivos(directorio, texto_buscar, extension=".txt"):
resultados = []
for raiz, _, archivos in os.walk(directorio):
for archivo in archivos:
if archivo.endswith(extension):
ruta_completa = os.path.join(raiz, archivo)
try:
with open(ruta_completa, "r", encoding="utf-8") as f:
contenido = f.read()
if texto_buscar in contenido:
resultados.append(ruta_completa)
except Exception:
# Ignorar archivos que no se pueden leer
pass
return resultados
# Uso
archivos_encontrados = buscar_en_archivos(".", "Python")
for archivo in archivos_encontrados:
print(f"Encontrado en: {archivo}")
Mejores prácticas
- Siempre usa el administrador de contexto
with
para asegurarte de que los archivos se cierren correctamente, incluso si ocurren errores. - Especifica la codificación al trabajar con archivos de texto, preferiblemente UTF-8.
- Maneja las excepciones que pueden ocurrir al trabajar con archivos.
- Usa
newline=""
al trabajar con archivos CSV para manejar correctamente los saltos de línea en diferentes sistemas operativos. - Considera usar
pathlib
en lugar deos.path
para un manejo más moderno y orientado a objetos de las rutas de archivos. - Evita leer archivos grandes completos en memoria. En su lugar, procésalos línea por línea.
- Usa módulos especializados para formatos específicos (como
csv
,json
,pickle
, etc.) en lugar de intentar parsear manualmente.
Ejercicios prácticos
- Crea un programa que lea un archivo de texto y genere un informe con el número de líneas, palabras y caracteres.
- Implementa un sistema simple de base de datos usando archivos CSV, con funciones para añadir, buscar, actualizar y eliminar registros.
- Desarrolla un script que combine varios archivos CSV en uno solo, asegurándose de que las columnas coincidan.
- Crea un programa que lea un archivo JSON con información de productos y genere un informe de inventario en formato CSV.
- Implementa un sistema de respaldo que copie archivos modificados en las últimas 24 horas a un directorio de respaldo.
En la próxima lección, exploraremos las expresiones regulares en Python, una herramienta poderosa para trabajar con patrones de texto.