24 · Leer y escribir archivos
open(), modos, el with statement, lectura lĂnea a lĂnea y por quĂ© especificar siempre encoding='utf-8' te salva de sorpresas en Windows.
`open(path, mode)` devuelve un **objeto de archivo** â un handle a travĂ©s del cual lees o escribes bytes. El `with` statement es un **gestor de contexto** que garantiza que el archivo se cierra en el momento en que el bloque indentado termina, incluso si se lanza una excepciĂłn dentro.
Sin esto:
Sin handles de archivo explĂcitos, no hay forma de leer datos de entrenamiento del disco, escribir registros de mĂ©tricas ni guardar y cargar modelos serializados. Todo pipeline de ML empieza y termina con I/O.
Para leer o escribir un archivo primero necesitas un handle â un objeto que representa la conexiĂłn abierta al archivo en disco. open(path, mode) crea ese handle. El string mode controla si estĂĄs leyendo ("r"), escribiendo ("w", trunca primero), añadiendo ("a") o usando una variante binaria ("rb", "wb"). El modo por defecto es "r". Dejar un archivo abierto mĂĄs tiempo del necesario desperdicia recursos del SO y puede corromper datos si el programa falla antes de vaciar el bĂșfer. El with statement lo resuelve automĂĄticamente: sin importar cĂłmo termine el bloque â retorno normal, excepciĂłn, break â Python llama f.close() por ti.
Python (in browser)
`f.writelines(iterable)` escribe cada elemento sin añadir separadores â debes incluir `\n` tĂș mismo. `f.read()` devuelve todo el archivo como un Ășnico string; `f.readlines()` devuelve una lista de lĂneas, cada una aĂșn con su salto de lĂnea al final.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Iterar `for line in f:` lee una lĂnea a la vez â Python nunca carga todo el archivo en memoria. Siempre llama `.rstrip()` (o `.rstrip("\n")`) para eliminar el salto de lĂnea final que `readline` preserva; olvidarlo provoca salida con doble espacio al hacer `print`.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
El `with` statement llama a `f.__exit__()` al final del bloque, lo que vacĂa cualquier byte en bĂșfer y cierra el descriptor de archivo del SO. Sin Ă©l, un crash entre `open()` y `close()` filtra el descriptor â en procesos de larga duraciĂłn esto agota el lĂmite del SO y lanza `OSError: Too many open files`.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
¿Qué hace abrir un archivo con el modo `"a"`?
- `open(path, mode, encoding="utf-8")` devuelve un handle de archivo. Modos: `"r"` lectura, `"w"` escritura (trunca), `"a"` append, `"rb"`/`"wb"` binario. Especifica siempre `encoding` para archivos de texto.
- Usa `with open(...) as f:` â el gestor de contexto garantiza que `f.close()` se llama incluso si se lanza una excepciĂłn dentro del bloque.
- Itera `for line in f:` para leer lĂnea a lĂnea de forma eficiente en memoria. Llama `.rstrip()` para eliminar el salto de lĂnea final.
Los datos de entrenamiento viven en archivos CSV, JSONL o texto plano en disco â `open()` es la puerta de entrada. El registro de mĂ©tricas escribe pĂ©rdida y exactitud despuĂ©s de cada Ă©poca en un archivo `.log` abierto en modo `"a"`. Los checkpoints de modelos usan modo binario internamente: `torch.save(state_dict, "checkpoint.pt")` y `np.save("weights.npy", arr)` de numpy escriben bytes crudos. `encoding="utf-8"` es obligatorio al leer corpus de texto multilingĂŒe para tareas de NLP.
Si lo quitas: Sin I/O de archivos, cada dataset tendrĂa que estar codificado directamente en el script y todo modelo entrenado se perderĂa al salir del proceso. Los archivos son la capa de persistencia de todo pipeline de ML.