Kodokon kodokon.com

Archivos y módulos: with, import, organización

Lee y escribe archivos de forma limpia con with, intercambia JSON y organiza tu código en módulos importables.

10 min · 3 preguntas

Abrir esta lección en Kodokon

Leer y escribir archivos es el pan de cada día de un programa real: exportaciones, registros, configuraciones. La palabra clave with abre el archivo y garantiza que se cierre, incluso si ocurre un error en mitad del bloque. Es la única forma profesional de abrir un archivo: sin ella, un close() olvidado puede corromper datos o agotar los recursos del sistema.

PYTHON
lines = ["alpha", "beta", "gamma"]

with open("notes.txt", "w", encoding="utf-8") as f:
    for line in lines:
        f.write(line + "\n")

with open("notes.txt", encoding="utf-8") as f:
    content = f.read()

print(content)
El modo 'w' escribe sobrescribiendo el contenido; sin modo, se lee.

Para los datos estructurados, no inventes tu propio formato: el módulo json de la biblioteca estándar convierte diccionarios y listas en texto, y a la inversa. Es el formato universal de intercambio entre programas, APIs y archivos de configuración.

PYTHON
import json

config = {"debug": True, "retries": 3}

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

with open("config.json", encoding="utf-8") as f:
    loaded = json.load(f)

print(loaded["retries"])  # 3
json.dump escribe la estructura, json.load la reconstruye.

Un módulo no es más que un archivo .py: import billing carga billing.py y ejecuta su contenido una sola vez. Organiza tu código por responsabilidad - un módulo para la facturación, otro para el almacenamiento - y mantén las instrucciones import al principio del archivo. La comprobación if __name__ == "__main__" distingue dos situaciones: cuando se ejecuta directamente, el archivo ejecuta este bloque; cuando se importa, lo ignora.

PYTHON
def compute_total(prices):
    return round(sum(prices), 2)

def main():
    print(compute_total([9.99, 4.5, 20.0]))

if __name__ == "__main__":
    main()
Contenido de billing.py: importable en cualquier parte, ejecutable directamente.
BASH
python billing.py
Ejecutado así, el archivo ejecuta main(); importado, no hace nada.

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. ¿Cuál es la principal ventaja de with open(...) frente a open() a secas?
    • El archivo se cierra automáticamente, incluso en caso de error
    • Leer el archivo es más rápido
    • El archivo se crea si no existe, sea cual sea el modo
  2. ¿Cuál es la diferencia entre los modos "w" y "a"?
    • "w" sobrescribe el contenido existente, "a" añade al final
    • "w" escribe texto, "a" escribe binario
    • "w" crea el archivo, "a" falla si no existe
  3. ¿Para qué sirve la comprobación if __name__ == "__main__"?
    • Para verificar que el archivo se llama realmente main.py
    • Para ejecutar un bloque solo cuando el archivo se lanza directamente
    • Para impedir que otros archivos importen el módulo