Ficheros

Python puede leer y escribir ficheros de texto o binarios.

Trabajar con ficheros: with ... as ...

Las palabras reservadas with y as se introdujeron en Python 2.6 (publicado en septiembre de 2006, aunque estaban disponibles en Python 2.5 en el módulo __future__) para facilitar, entre otros, la forma de trabajar con ficheros.

Su sintaxis general es la siguiente:

with EXPRESIÓN as VARIABLE:
    BLOQUE DE INSTRUCCIONES

En el caso de los ficheros, la expresión es una llamada a la función open() y la variable es la conexión con el fichero:

with open("FICHERO") as fichero:
    BLOQUE DE INSTRUCCIONES

La función open puede tener varios argumentos. Los más importantes son

with open("FICHERO", mode="MODO", encoding="CODIFICACIÓN") as fichero:
    BLOQUE DE INSTRUCCIONES

En estos apuntes se trabaja únicamente con ficheros de texto y se utiliza siempre el juego de caracteres UTF-8.


Si el sistema operativo utiliza de forma predeterminada el juego de caracteres UTF-8, no haría falta indicar el juego de caracteres al abrir el fichero. Para saber cuál es el juego de caracteres predeterminado se puede ejecutar en el entorno interactivo las instrucciones siguientes (en el ejemplo, el juego de caracteres es CP-1252, que utiliza Windows):

>>> import locale
>>> print(locale.getpreferredencoding(False))
cp1512

De todas formas, aunque el juego de caracteres sea UTF-8, se recomienda indicar siempre explícitamente el juego de caracteres al abrir un fichero, ya que los programas escritos en un sistema operativo se pueden acabar ejecutando en otro.

Modos de escritura

Los modos de escritura son:


Se puede escribir en el fichero

La función print() añade un salto de línea al final de la cadena añadida al fichero, pero el método write no lo hace, por lo que habrá que añadirlo explícitamente.


Los ejemplos siguientes muestran la diferencia entre cada uno de los modos de escritura (usando la función print() o el método write):

Modos de lectura

Los modos de lectura son:

En construcciónFaltan ejemplos de lectura y desplazamiento.

Abrir varios ficheros a la vez

Se pueden abrir varios ficheros a la vez en una única construcción with ... mediante varias funciones open(...) as .... separadas con comas. Cada fichero se puede abrir en un modo distinto.

ruta_1 = "prueba_1.txt"
ruta_2 = "prueba_2.txt"
with open(ruta_1, mode="w", encoding="utf-8") as fichero_1, open(ruta_2, mode="w", encoding="utf-8") as fichero_2:
    print("Hola", file=fichero_1)
    print("Adios", file=fichero_2)

Abrir automáticamente en el navegador

Si el fichero que se ha creado con Python es un página web, puede ser de utilidad que el fichero se abra automáticamente en el navegador para ver el resultado inmediatamente.

Para ello se puede utilizar la función open() del módulo webbrowser de la biblioteca estándar, que abre el fichero indicado con la aplicación asociada en el sistema operativo.

import webbrowser


def main():
    ruta = "prueba.html"

    with open(ruta, mode="w", encoding="utf-8") as fichero:
        print("<!DOCTYPE html>", file=fichero)
        print('<html lang="es">', file=fichero)
        print("<head>", file=fichero)
        print('  <meta charset="utf-8">', file=fichero)
        print("  <title>HTML 5</title>", file=fichero)
        print(
            '  <meta name="viewport" content="width=device-width, initial-scale=1.0">',
            file=fichero,
        )
        print("</head>", file=fichero)
        print("", file=fichero)
        print("<body>", file=fichero)
        print("  <p>Esta página es una página HTML 5 válida.</p>", file=fichero)
        print("</body>", file=fichero)
        print("</html>", file=fichero)

    webbrowser.open(ruta)


if __name__ == "__main__":
    main()

Es fundamental que el juego de caracteres en el que se guarda el fichero (línea 7 en el ejemplo anterior) sea el mismo que el que se declara en la etiqueta <meta> (línea 11 en el ejemplo anterior). Si no es así, el navegador tendrá problemas al mostrar caracteres "no ingleses" (acentos, eñes, etc.). En el ejemplo anterior se utiliza UTF-8, el juego de caracteres recomendado para páginas web.

Para saber más