Curso de Python / Leer y escribir archivos de texto con with y codificación
Abre los archivos de texto con una codificación explícita y utiliza with para cerrarlos al salir del bloque. El modo w trunca un archivo existente, así que distingue crear una salida nueva de reemplazar datos que necesitas conservar.
Elegir el modo de apertura y la codificación
| Modo | Objetivo | Comportamiento con archivos existentes |
|---|---|---|
| r | Leer | Falla si el archivo no existe |
| w | Escribir contenido de sustitución | Trunca el contenido anterior |
| a | Añadir al final | Crea el archivo si no existe |
| x | Crear sin reemplazar | Falla si ya existe |
Una codificación establece cómo se representan los caracteres mediante bytes. Para datos UTF-8, indica encoding="utf-8" en lugar de depender de la configuración del entorno. errors="ignore" puede descartar datos ilegibles y no debe convertirse en una solución general para ocultar errores.
La guía oficial de lectura y escritura explica los modos y el uso de with. Las rutas con pathlib ayudan a identificar qué archivo se abrirá.
Escribir, añadir y leer un archivo completo
Trabaja en una carpeta desechable. El programa reinicia notes-demo.txt con el modo w en cada ejecución; un archivo anterior con ese nombre perdería su contenido.
Guarda el código como text_files.py en UTF-8 y ejecuta python text_files.py desde la carpeta de práctica con el entorno virtual seleccionado. Fuera del entorno en macOS o Ubuntu, utiliza python3 si corresponde al intérprete preparado.
from pathlib import Path
path = Path("notes-demo.txt")
with path.open("w", encoding="utf-8", newline="\n") as f:
f.write("coffee:3500\n")
f.write("lunch:8000\n")
with path.open("a", encoding="utf-8") as f:
f.write("bus:2500\n")
with path.open("r", encoding="utf-8") as f:
for line in f:
print(line.rstrip("\n"))
La salida esperada es:
coffee:3500
lunch:8000
bus:2500
El primer bloque escribe dos registros, el segundo añade otro y el tercero los recorre. Cada with cierra el archivo aunque el bloque termine por una excepción, pero ese cierre no revierte una escritura ni recupera un contenido truncado.
Leer todo el contenido o recorrer líneas
read() devuelve el contenido restante como una cadena. Recorrer for line in f procesa líneas sin cargar innecesariamente el archivo completo. Al llegar al final, necesitas abrir de nuevo el archivo o reposicionar deliberadamente su lectura antes de volver a leerlo.
strip() elimina espacios de los extremos, incluidos espacios que podrían ser significativos. Si únicamente quieres quitar el salto de línea final, limita la operación, por ejemplo con rstrip("\n"). La apertura en modo texto y los ajustes de newline también pueden traducir los finales de línea.
Proteger originales y distinguir las causas de error
Ante FileNotFoundError, revisa la ruta resuelta y la carpeta de trabajo. Ante PermissionError, comprueba permisos, bloqueos y si el destino es una carpeta. Ante UnicodeDecodeError, identifica la codificación real. Sustituir cualquier fallo por una cadena vacía confunde datos ausentes con un archivo válido sin contenido.
Para datos importantes puedes escribir primero en un archivo temporal separado, validarlo y reemplazar el destino cuando corresponda. Esa estrategia también necesita una política de recuperación; with garantiza el cierre, no deshace operaciones anteriores.
Cambia temporalmente el primer w por a y ejecuta dos veces para observar registros duplicados. Después restaura el ejemplo. Captura únicamente errores para los que hayas definido una recuperación, utilizando el manejo de excepciones, y conserva el archivo original antes de experimentar con una sustitución.




