Leer un archivo de texto en Python

Leer un archivo en Python es un for. Pero el ejemplo típico tiene un fallo que se ve a simple vista —salen líneas en blanco de más— y hay un error que tarde o temprano te encuentras: UnicodeDecodeError.

Dos formas de hacer lo mismo. Python tiene el módulo os de toda la vida, que trabaja con cadenas, y pathlib, que trabaja con objetos Path y es lo que se recomienda hoy. Los ejemplos de esta página usan pathlib; cuando el equivalente con os es distinto, lo indicamos. Y una diferencia con la versión anterior de la página: ya no aparecen rutas como /home/decodigo/Documentos/…, que solo existían en el ordenador de quien la escribió.

Línea a línea, y el problema de las líneas en blanco

from pathlib import Path
ruta = Path("salida/notas.txt")

with ruta.open(encoding="utf-8") as archivo:
    for linea in archivo:
        print(linea)
salidaPrimera línea

Segunda línea

Tercera línea

Este era el ejemplo de la versión anterior, y sale con una línea en blanco entre cada línea. Cada linea trae su propio \n al final, y print añade otro. Se arregla quitándolo:

with ruta.open(encoding="utf-8") as archivo:
    for linea in archivo:
        print(linea.rstrip("\n"))
salidaPrimera línea
Segunda línea
Tercera línea

Recorrer el archivo así lee una línea cada vez, sin cargarlo entero en memoria. Es la forma correcta para archivos grandes, como un registro de varios gigas.

Todo de golpe

print(repr(ruta.read_text(encoding="utf-8")))
print(ruta.read_text(encoding="utf-8").splitlines())
salida'Primera línea\nSegunda línea\nTercera línea\n'
['Primera línea', 'Segunda línea', 'Tercera línea']

read_text devuelve el archivo entero como una cadena; splitlines() la parte en una lista, ya sin los saltos. Para archivos pequeños —configuración, una plantilla— es lo más cómodo.

Contar líneas sin cargar el archivo

with ruta.open(encoding="utf-8") as f:
    print("número de líneas:", sum(1 for _ in f))
salidanúmero de líneas: 3

UnicodeDecodeError

Path("salida/latin1.txt").read_text(encoding="utf-8")
salidaUnicodeDecodeError: 'utf-8' codec can't decode byte 0xf3 in position 5: invalid continuation byte

Significa que el archivo no está en la codificación que dijiste. Este es un «canción» guardado en Latin-1, la codificación de muchos programas antiguos de Windows, donde la «ó» es el byte 0xf3. Si sabes cuál es, se lee sin más:

Path("salida/latin1.txt").read_text(encoding="latin-1")
salidacanción
No arregles esto con errors="ignore": las letras que no entiende desaparecen sin aviso. Si no sabes la codificación, errors="replace" al menos deja un � donde había algo raro, y así lo ves.

Si el archivo no está

salidaFileNotFoundError: [Errno 2] No such file or directory: 'no_existe.txt'

Se captura con except FileNotFoundError. Lo explicamos con más detalle en errores y excepciones.

Más información en inglés: Read a txt file in Python.

Todo el código se ejecutó con Python 3.14 en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.

Deja un comentario