Cristhian Villegas
Backend10 min read0 views

Manejo de Archivos en Python: Leer, Escribir y Organizar Datos

Manejo de Archivos en Python: Leer, Escribir y Organizar Datos

Introduccion: por que leer y escribir archivos es fundamental

Bienvenido a la parte 6 de 10 de nuestro curso de Python para principiantes. Hasta ahora, todos los datos que hemos usado en nuestros programas desaparecen cuando el programa termina. Si cierras la terminal, todo se pierde.

Para que los datos persistan (se guarden de forma permanente), necesitamos escribirlos en archivos. Ya sea un archivo de texto, un CSV con datos tabulares, o un JSON con datos estructurados, Python hace que trabajar con archivos sea sencillo y seguro.

Logo de Python

Abrir archivos: la funcion open() y los modos

La funcion open() es la puerta de entrada para trabajar con archivos en Python. Recibe dos parametros principales: el nombre del archivo y el modo en que quieres abrirlo.

python
1# Sintaxis basica
2archivo = open("mi_archivo.txt", "r")  # abrir para lectura
3# ... hacer algo con el archivo ...
4archivo.close()  # SIEMPRE cerrar el archivo

Modos de apertura

Modo Descripcion Si el archivo no existe
"r" Lectura (read) — solo leer Da error
"w" Escritura (write) — borra el contenido anterior Lo crea
"a" Agregar (append) — escribe al final sin borrar Lo crea
"r+" Lectura y escritura Da error
⚠️ Cuidado con el modo "w": Este modo borra todo el contenido del archivo antes de escribir. Si abres un archivo existente con "w", perderas toda la informacion que tenia. Si quieres agregar contenido sin borrar, usa "a".

Leer archivos: read(), readline(), readlines()

Python tiene 3 formas principales de leer el contenido de un archivo:

read() — leer todo el contenido

python
1# Supongamos que tenemos un archivo "saludo.txt" con este contenido:
2# Hola Mundo
3# Bienvenido a Python
4# Esto es un archivo de texto
5
6archivo = open("saludo.txt", "r")
7contenido = archivo.read()  # lee TODO el archivo como un string
8print(contenido)
9archivo.close()
10
11# Salida:
12# Hola Mundo
13# Bienvenido a Python
14# Esto es un archivo de texto

readline() — leer una linea a la vez

python
1archivo = open("saludo.txt", "r")
2
3linea1 = archivo.readline()  # lee la primera linea
4print(linea1)  # Hola Mundo
5
6
7linea2 = archivo.readline()  # lee la segunda linea
8print(linea2)  # Bienvenido a Python
9
10
11archivo.close()

readlines() — leer todas las lineas como lista

python
1archivo = open("saludo.txt", "r")
2lineas = archivo.readlines()  # devuelve una lista de lineas
3print(lineas)
4# ['Hola Mundo\n', 'Bienvenido a Python\n', 'Esto es un archivo de texto']
5archivo.close()
6
7# Recorrer linea por linea (forma mas comun)
8archivo = open("saludo.txt", "r")
9for linea in archivo:
10    print(linea.strip())  # strip() elimina el \n al final
11archivo.close()
💡 Tip: Usar strip() al leer lineas es muy comun porque elimina los espacios en blanco y saltos de linea (\n) al inicio y final del texto.

Escribir archivos: write(), writelines()

Para escribir en un archivo, lo abrimos en modo "w" (escribir desde cero) o "a" (agregar al final).

write() — escribir un string

python
1# Crear un archivo nuevo y escribir contenido
2archivo = open("notas.txt", "w")
3archivo.write("Mi primera nota\n")
4archivo.write("Python es genial\n")
5archivo.write("Estoy aprendiendo a escribir archivos\n")
6archivo.close()
7
8# El archivo "notas.txt" ahora contiene:
9# Mi primera nota
10# Python es genial
11# Estoy aprendiendo a escribir archivos

writelines() — escribir una lista de strings

python
1lineas = [
2    "Linea 1: Introduccion\n",
3    "Linea 2: Desarrollo\n",
4    "Linea 3: Conclusion\n"
5]
6
7archivo = open("documento.txt", "w")
8archivo.writelines(lineas)
9archivo.close()

Agregar contenido con modo "a"

python
1# Agregar al final del archivo existente
2archivo = open("notas.txt", "a")
3archivo.write("Esta linea se agrega al final\n")
4archivo.close()
5
6# Ahora "notas.txt" tiene 4 lineas en lugar de 3
📌 Nota: write() no agrega saltos de linea automaticamente. Debes incluir \n al final de cada linea si quieres que cada texto aparezca en una linea separada.

El bloque with (context manager): la forma segura

Olvidar cerrar un archivo con close() puede causar problemas: datos que no se guardan, archivos bloqueados, etc. Python tiene una solucion elegante: el bloque with.

python
1# SIN with (forma insegura — puedes olvidar close())
2archivo = open("datos.txt", "r")
3contenido = archivo.read()
4archivo.close()  # si hay un error antes de esta linea, el archivo queda abierto
5
6# CON with (forma segura — se cierra automaticamente)
7with open("datos.txt", "r") as archivo:
8    contenido = archivo.read()
9    print(contenido)
10# Aqui el archivo ya se cerro automaticamente, incluso si hubo un error

Siempre usa with. Es la forma recomendada y segura de trabajar con archivos en Python. El archivo se cierra automaticamente al salir del bloque, sin importar si hubo errores.

python
1# Escribir con with
2with open("lista_compras.txt", "w") as archivo:
3    archivo.write("1. Leche\n")
4    archivo.write("2. Pan\n")
5    archivo.write("3. Huevos\n")
6
7# Leer con with
8with open("lista_compras.txt", "r") as archivo:
9    for linea in archivo:
10        print(linea.strip())
11# 1. Leche
12# 2. Pan
13# 3. Huevos
💡 Regla de oro: A partir de ahora, siempre usa with open(...) as archivo: en lugar de open() + close(). Es mas seguro, mas limpio y mas corto.

Trabajar con archivos CSV

Los archivos CSV (Comma-Separated Values) son archivos de texto donde los datos estan separados por comas. Son muy comunes para exportar datos de hojas de calculo, bases de datos, etc.

Leer un archivo CSV

python
1import csv
2
3# Supongamos que tenemos "estudiantes.csv":
4# nombre,edad,calificacion
5# Ana,20,95
6# Luis,22,88
7# Maria,21,92
8
9with open("estudiantes.csv", "r") as archivo:
10    lector = csv.reader(archivo)
11
12    # Leer el encabezado
13    encabezado = next(lector)
14    print(f"Columnas: {encabezado}")
15
16    # Leer cada fila
17    for fila in lector:
18        nombre = fila[0]
19        edad = fila[1]
20        calificacion = fila[2]
21        print(f"  {nombre} tiene {edad} anios y saco {calificacion}")

Leer CSV como diccionarios

python
1import csv
2
3# DictReader usa la primera fila como claves
4with open("estudiantes.csv", "r") as archivo:
5    lector = csv.DictReader(archivo)
6
7    for fila in lector:
8        print(f"  {fila['nombre']} - Calificacion: {fila['calificacion']}")

Escribir un archivo CSV

python
1import csv
2
3estudiantes = [
4    ["nombre", "edad", "calificacion"],  # encabezado
5    ["Ana", 20, 95],
6    ["Luis", 22, 88],
7    ["Maria", 21, 92]
8]
9
10with open("estudiantes.csv", "w", newline="") as archivo:
11    escritor = csv.writer(archivo)
12    for fila in estudiantes:
13        escritor.writerow(fila)
14
15print("Archivo CSV creado correctamente.")
📌 Nota: El parametro newline="" en open() es importante al escribir CSV en Windows. Sin el, podrias obtener lineas en blanco adicionales entre cada fila.

Trabajar con archivos JSON

JSON (JavaScript Object Notation) es un formato de texto muy popular para almacenar datos estructurados. Es similar a los diccionarios de Python, lo que hace que sea muy natural trabajar con el.

Leer un archivo JSON

python
1import json
2
3# Supongamos que tenemos "config.json":
4# {
5#     "nombre": "Mi App",
6#     "version": "1.0",
7#     "debug": true,
8#     "idiomas": ["es", "en"]
9# }
10
11with open("config.json", "r") as archivo:
12    datos = json.load(archivo)  # convierte JSON a diccionario de Python
13
14print(datos["nombre"])     # Mi App
15print(datos["version"])    # 1.0
16print(datos["debug"])      # True
17print(datos["idiomas"])    # ['es', 'en']
18print(type(datos))         # <class 'dict'>

Escribir un archivo JSON

python
1import json
2
3configuracion = {
4    "nombre": "Mi App",
5    "version": "2.0",
6    "debug": False,
7    "idiomas": ["es", "en", "fr"],
8    "base_datos": {
9        "host": "localhost",
10        "puerto": 5432
11    }
12}
13
14with open("config.json", "w") as archivo:
15    json.dump(configuracion, archivo, indent=4, ensure_ascii=False)
16    # indent=4 hace que el JSON se vea bonito (con indentacion)
17    # ensure_ascii=False permite caracteres especiales como acentos
18
19print("Archivo JSON guardado.")

Convertir entre JSON y Python

python
1import json
2
3# De diccionario de Python a string JSON
4datos = {"nombre": "Ana", "edad": 25}
5json_string = json.dumps(datos, indent=2)
6print(json_string)
7# {
8#   "nombre": "Ana",
9#   "edad": 25
10# }
11
12# De string JSON a diccionario de Python
13texto_json = '{"ciudad": "Guadalajara", "pais": "Mexico"}'
14datos = json.loads(texto_json)
15print(datos["ciudad"])  # Guadalajara
💡 Tip: Recuerda la diferencia: json.load() / json.dump() trabajan con archivos, mientras que json.loads() / json.dumps() (con la "s" de string) trabajan con textos.

Manejo de rutas con os.path

Cuando trabajas con archivos, necesitas manejar rutas (paths) correctamente. El modulo os.path te ayuda a construir rutas que funcionen en cualquier sistema operativo (Windows, Mac, Linux).

python
1import os
2
3# Verificar si un archivo existe
4print(os.path.exists("notas.txt"))  # True o False
5
6# Obtener el nombre del archivo sin la ruta
7print(os.path.basename("/home/usuario/documentos/notas.txt"))
8# notas.txt
9
10# Obtener solo el directorio
11print(os.path.dirname("/home/usuario/documentos/notas.txt"))
12# /home/usuario/documentos
13
14# Unir rutas de forma segura (funciona en cualquier SO)
15ruta = os.path.join("documentos", "notas", "archivo.txt")
16print(ruta)  # documentos/notas/archivo.txt (o documentos\notas\archivo.txt en Windows)
17
18# Obtener la extension del archivo
19nombre, extension = os.path.splitext("foto.jpg")
20print(nombre)     # foto
21print(extension)  # .jpg
22
23# Obtener el directorio actual
24print(os.getcwd())  # /home/usuario/mi_proyecto
25
26# Crear un directorio si no existe
27if not os.path.exists("datos"):
28    os.makedirs("datos")
29    print("Directorio 'datos' creado.")
⚠️ Importante: Nunca escribas rutas "a mano" como "carpeta\archivo.txt". Usa siempre os.path.join("carpeta", "archivo.txt") para que tu codigo funcione correctamente en Windows, Mac y Linux.

Ejemplo practico: sistema de notas en JSON

Vamos a crear un sistema de notas que guarda y lee datos de un archivo JSON. Este es un ejemplo completo que combina todo lo aprendido:

python
1import json
2import os
3from datetime import datetime
4
5ARCHIVO_NOTAS = "mis_notas.json"
6
7def cargar_notas():
8    """Carga las notas desde el archivo JSON."""
9    if os.path.exists(ARCHIVO_NOTAS):
10        with open(ARCHIVO_NOTAS, "r") as archivo:
11            return json.load(archivo)
12    return []  # si el archivo no existe, retorna lista vacia
13
14def guardar_notas(notas):
15    """Guarda las notas en el archivo JSON."""
16    with open(ARCHIVO_NOTAS, "w") as archivo:
17        json.dump(notas, archivo, indent=4, ensure_ascii=False)
18
19def agregar_nota(titulo, contenido):
20    """Agrega una nueva nota."""
21    notas = cargar_notas()
22    nueva_nota = {
23        "id": len(notas) + 1,
24        "titulo": titulo,
25        "contenido": contenido,
26        "fecha": datetime.now().strftime("%Y-%m-%d %H:%M")
27    }
28    notas.append(nueva_nota)
29    guardar_notas(notas)
30    print(f"  Nota '{titulo}' guardada correctamente.")
31
32def listar_notas():
33    """Muestra todas las notas."""
34    notas = cargar_notas()
35    if not notas:
36        print("  No hay notas guardadas.")
37        return
38    print(f"  Total de notas: {len(notas)}")
39    for nota in notas:
40        print(f"  [{nota['id']}] {nota['titulo']} ({nota['fecha']})")
41
42def ver_nota(id_nota):
43    """Muestra el detalle de una nota por su ID."""
44    notas = cargar_notas()
45    for nota in notas:
46        if nota["id"] == id_nota:
47            print(f"  Titulo: {nota['titulo']}")
48            print(f"  Fecha: {nota['fecha']}")
49            print(f"  Contenido: {nota['contenido']}")
50            return
51    print(f"  Nota con ID {id_nota} no encontrada.")
52
53def eliminar_nota(id_nota):
54    """Elimina una nota por su ID."""
55    notas = cargar_notas()
56    notas_filtradas = [n for n in notas if n["id"] != id_nota]
57    if len(notas_filtradas) == len(notas):
58        print(f"  Nota con ID {id_nota} no encontrada.")
59        return
60    guardar_notas(notas_filtradas)
61    print(f"  Nota con ID {id_nota} eliminada.")
62
63# Probemos el sistema
64print("--- Agregar notas ---")
65agregar_nota("Compras", "Comprar leche, pan y huevos")
66agregar_nota("Tarea Python", "Terminar el ejercicio de archivos")
67agregar_nota("Idea", "Crear un programa para organizar mis gastos")
68
69print("\n--- Listar notas ---")
70listar_notas()
71
72print("\n--- Ver nota 2 ---")
73ver_nota(2)
74
75print("\n--- Eliminar nota 1 ---")
76eliminar_nota(1)
77
78print("\n--- Notas actualizadas ---")
79listar_notas()

Este programa crea un archivo mis_notas.json que se ve asi:

json
1[
2    {
3        "id": 2,
4        "titulo": "Tarea Python",
5        "contenido": "Terminar el ejercicio de archivos",
6        "fecha": "2026-04-05 14:30"
7    },
8    {
9        "id": 3,
10        "titulo": "Idea",
11        "contenido": "Crear un programa para organizar mis gastos",
12        "fecha": "2026-04-05 14:30"
13    }
14]

Lo mas importante de este ejemplo es que las notas se guardan permanentemente. Puedes cerrar el programa, apagar la computadora, y al volver a ejecutarlo, tus notas seguiran ahi.

Resumen y proximo articulo

En este articulo aprendimos todo lo necesario para trabajar con archivos en Python:

  • open() con los modos r, w, a para abrir archivos
  • read(), readline(), readlines() para leer contenido
  • write(), writelines() para escribir contenido
  • with (context manager) para manejar archivos de forma segura
  • csv para leer y escribir archivos CSV
  • json para trabajar con datos estructurados en JSON
  • os.path para manejar rutas de archivos correctamente
📌 Siguiente articulo: En la parte 7 aprenderemos sobre funciones avanzadas — parametros por defecto, *args, **kwargs, funciones lambda y decoradores. Estas herramientas te permitiran escribir codigo mas profesional y reutilizable.
Share:
CV

Cristhian Villegas

Software Engineer specializing in Java, Spring Boot, Angular & AWS. Building scalable distributed systems with clean architecture.

Comments

Sign in to leave a comment

No comments yet. Be the first!

Related Articles