Manejo de archivos Python: lectura, escritura, CSV, JSON y pathlib con ejemplos

  1. Inicio
  2. Blog
  3. Desarrollo de software

Desarrollo de software

Manejo de archivos Python: Lectura, escritura, CSV, JSON y pathlib con ejemplos

Casi todos los scripts reales leen o escriben un archivo. Aprenda la forma segura de abrir archivos, elija el modo correcto, maneje CSV y JSON, trabaje con rutas usando pathlib y evite el error que borra sus datos.

9 min de lectura
Manejo de archivos Python: lectura, escritura, CSV, JSON y pathlib con ejemplos

Puntos clave

  • Abra siempre archivos con un bloque with, para que se cierren automáticamente.
  • El modo "w" borra un archivo existente. Utilice "a" para agregar uno o "x" para rechazar la sobrescritura.
  • Recorra el objeto del archivo para leer archivos grandes sin cargar todo en la memoria.
  • Pase encoding="utf-8" explícitamente y prefiera pathlib para crear rutas.

Registros, informes, configuración, exportaciones: tarde o temprano, cada script toca el sistema de archivos. El manejo de archivos Python es sencillo para empezar, pero unos pocos detalles deciden si su código es confiable o destruye datos silenciosamente.

Esta guía cubre archivos de texto, CSV, JSON, datos binarios y rutas, con un enfoque en hábitos seguros. Ejecutamos estos ejemplos en Python 3.13 en una carpeta temporal y el resultado que se muestra proviene de esa ejecución.

Abrir archivos con open() y con

La función incorporada open() devuelve un objeto de archivo. Úselo dentro de un bloque with:

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("first line\n")
    file.write("second line\n")

print(file.closed)

# True

Cuando finaliza el bloque, Python cierra el archivo, incluso si ocurrió un error dentro de él. Sin with, debe llamar a close() usted mismo y una excepción puede saltarse esa línea. El uso de un archivo después de que se haya cerrado genera un error:

file.read()

# ValueError: I/O operation on closed file.

Modos de archivo

El segundo argumento de open() dice lo que planea hacer:

Modo Significado Si el archivo existe Si no es así
r Leer (predeterminado) lo abre error
w escribir lo borra primero lo crea
un anexar Agrega al final lo crea
x Crear exclusivo error lo crea
r+ leer y escribir lo abre error

Agregue b para datos binarios, como en "rb" o "wb". El texto es el predeterminado y también se puede escribir explícitamente como t.

Escribir y adjuntar

write() no agrega un salto de línea, así que incluya \n usted mismo. Agregar mantiene lo que ya está ahí:

with open("notes.txt", "a", encoding="utf-8") as file:
    file.write("third line\n")

Compare eso con el modo "w", que reemplazó nuestras tres líneas por una, sin previo aviso:

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("replaced\n")

# notes.txt now contains only: replaced

Cuando no deba sobrescribir algo, utilice "x". Planteó FileExistsError en nuestra prueba, ya que notes.txt ya existía.

leer un archivo

Hay varias formas de leer y la elección correcta depende del tamaño del archivo:

Enfoque Devoluciones Lo mejor para
file.read() Una cuerda con todo Archivos pequeños
file.readline() la siguiente linea leyendo un encabezado
file.readlines() Una lista de líneas Archivos pequeños que necesitas como lista
para línea en archivo Una línea a la vez Cualquier tamaño, especialmente archivos grandes
with open("notes.txt", encoding="utf-8") as file:
    print(repr(file.read()))

# 'first line\nsecond line\n'

with open("notes.txt", encoding="utf-8") as file:
    for line in file:
        print(line.strip())

# first line
# second line
# third line

Observe los caracteres \n mantenidos en la cadena sin formato. strip() los elimina. Un objeto de archivo también recuerda su posición, por lo que la lectura continúa donde lo dejó:

with open("notes.txt", encoding="utf-8") as file:
    print(file.readline().strip())
    print(file.readlines())

# first line
# ['second line\n', 'third line\n']

Recorrer el archivo es la técnica clave para registros y exportaciones grandes. Lee una línea a la vez, por lo que no es necesario que un archivo de varios gigabytes quepa en la memoria.

Manejar errores de archivos

Es posible que falten archivos, que estén bloqueados o que sean ilegibles, así que planifique esto:

try:
    with open("missing.txt", encoding="utf-8") as file:
        data = file.read()
except FileNotFoundError as error:
    print(error)

# [Errno 2] No such file or directory: 'missing.txt'
Excepción Causa típica
Error de archivo no encontrado El camino no existe
ArchivoExisteError Modo x en un archivo existente
Error de permiso No permitido o bloqueado en Windows
Error de directorio IsA La ruta es una carpeta.
UnicodeDecodeError Se utilizó la codificación incorrecta.

Intente abrir el archivo y detectar el error, en lugar de verificar primero con exists(), ya que el archivo podría desaparecer entre la verificación y la apertura. Nuestra guía para el manejo de excepciones de Python cubre este enfoque.

archivos CSV

No divida las líneas CSV con comas, porque los valores entre comillas pueden contener comas. El módulo estándar csv maneja esas reglas. DictWriter y DictReader son las opciones más legibles:

import csv

with open("orders.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["id", "customer", "total"])
    writer.writeheader()
    writer.writerow({"id": 1, "customer": "Asha", "total": 1200})
    writer.writerow({"id": 2, "customer": "Ben", "total": 300})

with open("orders.csv", newline="", encoding="utf-8") as file:
    rows = list(csv.DictReader(file))

print(rows[0])
print(sum(int(r["total"]) for r in rows))

# {'id': '1', 'customer': 'Asha', 'total': '1200'}
# 1500

Dos detalles importan. Pase newline="" al abrir archivos CSV, como recomienda la documentación, para evitar filas en blanco en Windows. Y cada valor regresa como una cadena, números pares, por eso necesitábamos int() en la suma. Para trabajos pesados ​​con datos, una biblioteca como pandas puede ser una mejor opción.

Archivos JSON

JSON es el formato habitual para la configuración y los datos API. Se asigna claramente a diccionarios de Python y enumera:

import json

config = {"debug": True, "retries": 3, "hosts": ["a", "b"]}

with open("config.json", "w", encoding="utf-8") as file:
    json.dump(config, file, indent=2)

with open("config.json", encoding="utf-8") as file:
    print(json.load(file)["retries"])

# 3

Recuerde el nombre: dump y load trabajan con archivos, mientras que dumps y loads trabajan con cadenas. Los tipos como las fechas no se pueden almacenar directamente, por lo que primero deberá convertirlos en cadenas.

Trabajar con rutas usando pathlib

Pegar caminos junto con cadenas se rompe en los sistemas operativos. El módulo estándar pathlib maneja los separadores por usted y ofrece prácticos atajos:

from pathlib import Path

path = Path("data") / "reports" / "summary.txt"
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("all good\n", encoding="utf-8")

print(path.read_text(encoding="utf-8").strip())   # all good
print(path.suffix, path.stem, path.exists())      # .txt summary True
print(sorted(p.name for p in Path(".").glob("*.csv")))
# ['orders.csv']
Tarea rutalib
Unir caminos Ruta("a")/"b.txt"
Crear carpetas ruta.mkdir(padres=Verdadero, existe_ok=Verdadero)
Leer o escribir texto completo read_text(), write_text()
encontrar archivos glob("*.csv"), rglob("*.py")
Eliminar un archivo path.unlink()
Obtener la carpeta del script actual Path(__file__).parent

Este último resuelve un dolor de cabeza común. Las rutas relativas se resuelven desde donde ejecutó el script, no desde donde reside el script, por lo que crear rutas desde Path(__file__).parent evita muchas sorpresas de “archivo no encontrado”.

Archivos binarios

Las imágenes, los archivos PDF y los archivos ZIP no son texto. Ábralos con b y podrá leer y escribir bytes, sin codificación involucrada:

with open("pixel.bin", "wb") as file:
    file.write(bytes([255, 0, 128]))

with open("pixel.bin", "rb") as file:
    print(file.read())

# b'\xff\x00\x80'

Escrituras más seguras

Si un programa falla a la mitad de la escritura de un archivo importante, es posible que el resultado esté dañado. Una solución común es escribir primero en un archivo temporal y luego cambiarlo a su lugar:

temp = Path("settings.tmp")
temp.write_text("new", encoding="utf-8")
temp.replace("settings.txt")

print(Path("settings.txt").read_text(), temp.exists())

# new False

replace() sobrescribe el destino. En el mismo sistema de archivos, el cambio de nombre es generalmente atómico, por lo que los lectores ven el archivo antiguo o el nuevo en lugar de una mezcla a medio escribir.

Consejo: Nunca cree rutas de archivos directamente a partir de la entrada del usuario sin verificarlas. Un valor como ../../secrets.txt podría llegar a archivos fuera de la carpeta deseada. Esto se conoce como vulnerabilidad de recorrido de ruta.

Un ejemplo práctico: resumir un log

Este breve guión reúne varias ideas. Lee un registro una línea a la vez, por lo que su tamaño no importa, cuenta cada nivel usando Counter y escribe un resumen en un nuevo archivo:

from collections import Counter

counts = Counter()
with open("app.log", encoding="utf-8") as file:
    for line in file:
        counts[line.split()[0]] += 1

with open("summary.txt", "w", encoding="utf-8") as out:
    for level, total in counts.most_common():
        out.write(f"{level}: {total}\n")

# summary.txt
# ERROR: 2
# INFO: 2
# WARN: 1

Nuestro registro de muestra tenía cinco líneas. Una línea en blanco rompería line.split()[0], por lo que los scripts reales deberían omitir primero las líneas vacías.

Errores comunes

  • Usaste "w" cuando querías decir "a". Tus datos existentes se abren inmediatamente, incluso si nunca escribes nada.
  • Omitir la codificación. El valor predeterminado varía según el sistema, por lo que un script que funciona en Linux puede fallar en Windows con texto acentuado o emoji.
  • Llamar a read() en archivos grandes. Esto puede agotar la memoria, así que recorre las líneas.
  • Olvidar int() en los valores CSV. "10" + "20" da "1020".
  • Omitiendo newline="" para CSV. Es posible que obtengas filas en blanco inesperadas en Windows.
  • No probar el código del archivo. Utilice el accesorio tmp_path de pytest para que las pruebas nunca toquen archivos reales. Consulte nuestro tutorial de pytest.

Conclusión

Algunos hábitos cubren casi todo aquí: use with, configure la codificación, piense dos veces antes de "w" y deje que csv, json y pathlib hagan las partes difíciles. Para practicar, escriba un pequeño script que lea un CSV, totalice una columna y guarde un resumen JSON en una nueva carpeta.

Preguntas frecuentes

¿Cómo leo un archivo línea por línea en Python?

Ábralo en un bloque with y recorra el objeto del archivo. Lee una línea a la vez, por lo que funciona bien incluso para archivos muy grandes.

¿Cuál es la diferencia entre w y a modo?

El modo borra cualquier contenido existente tan pronto como se abre el archivo. El modo a mantiene el contenido existente y agrega nuevos datos al final del archivo.

¿Por qué debería usar with para abrir un archivo?

La instrucción with cierra el archivo automáticamente cuando finaliza el bloque, incluso si ocurre un error. Esto evita fugas y ayuda a garantizar que se escriban los datos.

¿Cómo compruebo si existe un archivo en Python?

Utilice Path(“name.txt”).exists() de pathlib. Si planea abrirlo inmediatamente después, detectar FileNotFoundError suele ser más confiable que verificarlo primero.

¿Por qué mi CSV tiene líneas en blanco en Windows?

Probablemente abriste el archivo sin newline=””. El módulo csv gestiona los finales de línea por sí mismo, así que pase ese argumento para evitar filas adicionales en blanco.

sigue aprendiendo

Trabajar con Stack Quora

¿Necesitas ayuda con pruebas, WordPress o SEO?

Ayudamos a los equipos a enviar mejor software y hacer crecer sus sitios. Cuéntenos en qué está trabajando y le sugeriremos un siguiente paso claro.

Sigue leyendo

Más guías sobre testing, IA y desarrollo moderno

¿Te gustó este artículo? Elige un tema y salta directo a nuestros tutoriales más recientes.

Inteligencia artificial

Explicación de las alucinaciones de la IA: por qué los modelos de lenguaje inventan cosas y cómo reducirlas

Se explicaron las alucinaciones de la IA: qué son, por qué los modelos de lenguaje las producen, tipos comunes, cómo reducirlas con conexión a tierr…

Leer artículo →
DevOps

Explicación de las variables de entorno: archivos .env, secretos y configuración bien hechos

Variables de entorno explicadas con ejemplos de Python que ejecutamos: leerlas y configurarlas, por qué cada valor es una cadena, archivos .env, her…

Leer artículo →
Desarrollo de software

Explicación de la limitación de velocidad de API: algoritmos, encabezados y manejo de errores 429

La limitación de la tasa de API se explica con una simulación que ejecutamos: depósito de tokens, ventana fija, ventana deslizante, 429 respuestas, …

Leer artículo →
Automatización de pruebas

Burlarse en Python: unittest.mock, patch y los errores que hacen que las pruebas mientan

Burlarse en Python con unittest.mock, probado: Mock y return_value, side_effect, parches donde se usa un nombre, especificación y autospec, fechas d…

Leer artículo →
Pruebas de software

Explicación de la cobertura del código: cobertura de línea versus sucursal y lo que realmente significa 100%

Cobertura del código explicada con una ejecución real de cobertura.py: cobertura de línea, rama y condición, lectura de un informe, por qué una cobe…

Leer artículo →
Bases de datos y SQL

DELETE vs TRUNCATE vs DROP en SQL: diferencias, reversión y cuándo usar cada uno

DELETE vs TRUNCATE vs DROP explicado con SQL probado: qué elimina cada uno, reversión, activadores, restablecimiento de identidad, velocidad y en qu…

Leer artículo →
Bases de datos y SQL

Vistas SQL explicadas: cree, use y evite los errores, con ejemplos

Vistas SQL explicadas con consultas que ejecutamos: creación de una vista, resultados en vivo, ocultación de columnas, rendimiento, vistas actualiza…

Leer artículo →
Desarrollo de software

Interfaz TypeScript versus tipo: diferencias reales, probadas con el compilador

Interfaz TypeScript versus tipo, verificado con el compilador real: qué pueden hacer ambos, qué puede hacer solo uno, fusión de declaraciones, exten…

Leer artículo →
Desarrollo de software

Python *args y **kwargs explicados: funciones flexibles con ejemplos claros

Python *args y **kwargs explicados con el código que ejecutamos: empaquetado y desempaquetado, orden de parámetros, argumentos solo de palabras clav…

Leer artículo →
Desarrollo de software

Funciones Lambda de Python: sintaxis, usos reales y cuándo no utilizarlas

Funciones lambda de Python explicadas con el código que ejecutamos: sintaxis, clasificación con clave, mapa y filtro, cierres, trampa de enlace tard…

Leer artículo →
Inteligencia artificial

¿Qué son los agentes de IA? Cómo funcionan, con un bucle de agente simple que puedes ejecutar

¿Qué son los agentes de IA? Una guía sencilla sobre el bucle del agente, las herramientas, la memoria y las barreras de seguridad, con un pequeño bu…

Leer artículo →
DevOps

Monitoreo versus observabilidad: la verdadera diferencia, con registros, métricas y seguimientos

Explicación del monitoreo versus observabilidad: fallas conocidas y desconocidas, registros, métricas y seguimientos, un recorrido por incidentes de…

Leer artículo →
DevOps

Docker Volumes versus Bind Mounts: persistir los datos del contenedor de la manera correcta

Se explican los volúmenes de Docker frente a los montajes de enlace: por qué desaparecen los datos del contenedor, volúmenes con nombre, montajes de…

Leer artículo →
Automatización de pruebas

TDD vs BDD: diferencias clave, una función creada en ambos sentidos y cuándo usar cada una

TDD vs BDD explicado con una característica de descuento construida en ambos sentidos: refactor rojo-verde con el código que ejecutamos, escenarios …

Leer artículo →
Pruebas de software

Pruebas de Aceptación de Usuario (UAT): Proceso, Lista de Verificación y Ejemplos Reales

Explicación de las pruebas de aceptación del usuario: quién las ejecuta, en qué se diferencia del control de calidad, un proceso de siete pasos, una…

Leer artículo →
Bases de datos y SQL

Valores NULL de SQL explicados: IS NULL, COALESCE, NULLIF y las trampas que se deben evitar

Los valores NULL de SQL se explican con las consultas que ejecutamos: lógica de tres valores, IS NULL, COALESCE, NULLIF, cómo los agregados, las uni…

Leer artículo →
Bases de datos y SQL

Declaración SQL CASE WHEN: sintaxis, ejemplos reales y errores comunes

CASO SQL CUANDO se explicó con las consultas que ejecutamos: formularios simples y buscados, orden de condiciones, pivotes con SUMA, trucos COUNT, c…

Leer artículo →
Desarrollo de software

¿Qué es JWT? Tokens web JSON explicados con un ejemplo práctico

¿Qué es JWT? JSON Web Tokens explicó: las tres partes, un token creado y manipulado en el código que ejecutamos, JWT vs sesiones, almacenamiento, to…

Leer artículo →
Desarrollo de software

Explicación del bucle de eventos de JavaScript: pila de llamadas, microtareas y temporizadores con ejemplos

El bucle de eventos de JavaScript explicado con el código que ejecutamos: pila de llamadas, colas de tareas y microtareas, por qué setTimeout 0 no e…

Leer artículo →
Desarrollo de software

Explicación de los generadores y el rendimiento de Python: ahorre memoria con ejemplos reales

Los generadores de Python y el rendimiento se explican con el código que ejecutamos: cómo se pausan y reanudan, midieron el ahorro de memoria, canal…

Leer artículo →
Inteligencia artificial

¿Qué son las incrustaciones? Los vectores y la similitud del coseno se explican de forma sencilla

¿Qué son las incrustaciones? Una guía en lenguaje sencillo sobre vectores, similitud de cosenos y búsqueda semántica, con un pequeño ejemplo que eje…

Leer artículo →
DevOps

Implementación azul-verde versus implementación canaria: diferencias, compensaciones y cómo elegir

Explicación de la implementación azul-verde versus canaria: cómo funciona cada uno, costo, riesgo y reversión, agrupación estable de usuarios que pr…

Leer artículo →
Automatización de pruebas

Pruebas inestables: qué las causa y cómo solucionarlas para siempre

Pruebas inestables explicadas con demostraciones que realizamos: las causas principales, cómo confirmar y diagnosticar una, correcciones adecuadas p…

Leer artículo →
Pruebas de software

Pruebas de carga frente a pruebas de estrés: diferencias, métricas y ejemplos de k6

Explicación de las pruebas de carga frente a las pruebas de estrés: qué prueba cada una, pruebas de picos y de absorción, las métricas que importan,…

Leer artículo →
Pruebas de software

Caso de prueba frente a escenario de prueba: diferencias clave, ejemplos y cuándo utilizar cada uno

Caso de prueba versus escenario de prueba explicado: definiciones claras, una tabla en paralelo, una función de restablecimiento de contraseña tomad…

Leer artículo →
Bases de datos y SQL

Optimización de consultas SQL: lea planes de ejecución y corrija consultas lentas, con tiempos

Optimización de consultas SQL probada en un millón de filas: lea planes de ejecución, agregue los índices correctos, corrija filtros no sargables, u…

Leer artículo →
Bases de datos y SQL

SQL UNION vs UNION ALL: diferencias, ejemplos y rendimiento probado

SQL UNION vs UNION ALL explicado con consultas que ejecutamos: duplicados, las reglas que siguen ambos, un error de datos real, rendimiento medido, …

Leer artículo →
Desarrollo de software

Tutorial de JavaScript Fetch API: GET, POST, manejo de errores y tiempos de espera

Un tutorial de JavaScript Fetch API probado en un servidor local: GET y POST, por qué 404 no arroja, un asistente reutilizable, cadenas de consulta,…

Leer artículo →
Desarrollo de software

Manejo de archivos Python: lectura, escritura, CSV, JSON y pathlib con ejemplos

El manejo de archivos Python se explica con el código que ejecutamos: modos abiertos, lectura de archivos grandes, CSV, JSON, pathlib, archivos bina…

Leer artículo →
Desarrollo de software

Clases y objetos de Python: tutorial de programación orientada a objetos con ejemplos reales

Clases y objetos de Python explicados con el código que ejecutamos: __init__, métodos, atributos de clase versus instancia, herencia, propiedades, m…

Leer artículo →
Inteligencia artificial

¿Qué es un modelo de lenguaje grande? Cómo funcionan los LLM, explicados sin exageraciones

¿Qué es un modelo de lenguaje grande? Los LLM explicados en lenguaje sencillo: tokens, incrustaciones, atención, entrenamiento, ventanas de temperat…

Leer artículo →
DevOps

Comandos de Linux para principiantes: la guía esencial de terminal con ejemplos

Comandos de Linux para principiantes, agrupados por tarea: navegación, archivos, visualización de registros, grep, canalizaciones, permisos, proceso…

Leer artículo →
Automatización de pruebas

Selenium vs Playwright: diferencias clave, comparación de códigos y cuál elegir

Comparación de Selenium vs Playwright: arquitectura, espera, soporte de navegador e idioma, depuración, la misma prueba en ambas herramientas, conse…

Leer artículo →
Pruebas de software

Partición de equivalencia: técnica de diseño de pruebas explicada con ejemplos resueltos

Explicación de la partición de equivalencia: cómo encontrar particiones válidas e inválidas, ejemplos prácticos para edades, contraseñas y cupones, …

Leer artículo →
Pruebas de software

Severidad vs Prioridad en Pruebas de Software: Diferencias, Matriz y Ejemplos Reales

Explicación de gravedad versus prioridad en las pruebas de software: definiciones claras, una matriz de cuatro vías con ejemplos, escalas de niveles…

Leer artículo →
Bases de datos y SQL

Tutorial de subconsultas SQL: tipos, subconsultas correlacionadas y EXISTENCIAS con ejemplos

Un tutorial de subconsultas SQL con consultas que ejecutamos: subconsultas escalares, IN, FROM y SELECT, subconsultas correlacionadas, EXISTS, la tr…

Leer artículo →
Bases de datos y SQL

Transacciones SQL y ACID explicados: COMMIT, ROLLBACK y niveles de aislamiento

Transacciones SQL y ACID explicadas con una transferencia bancaria que ejecutamos: COMMIT, ROLLBACK, puntos de guardado, bloqueos, niveles de aislam…

Leer artículo →
Desarrollo de software

Git merge vs rebase: diferencias, ejemplos y cuándo usar cada uno

Git merge vs rebase explicado con salida real del log, una tabla comparativa, la regla de oro del rebase y un flujo de trabajo seguro para equipos.

Leer artículo →
Desarrollo de software

List comprehension en Python: sintaxis, ejemplos y cuándo evitarla

List comprehension en Python explicada: sintaxis, filtros, if-else, bucles anidados, tiempos medidos y cuándo es mejor un bucle for normal.

Leer artículo →