AnteriorPosterior

12 - Ficheros de texto

Por: Nacho Cabanes
Actualizado: 17-08-2020 11:39
Tiempo de lectura estimado: 19 min.

 

Versión en video (12:34 min):

Fund.Prog con Python 2020

12 - Ficheros de texto

En esta entrega vamos a ver cómo manejar ficheros de texto en Python, que será una forma muy sencilla de guardar información y posteriormente recuperar información desde nuestros programas.

Como primer paso, vamos a entrar a Idle. Ya sabes que para estas cosas que guardan la información en nuestro ordenador, no nos bastará con un entorno online: tendrás que usar Idle, tendrás que usar PyCharm... pero no te bastará un entorno online.

Desde Idle, lo primero que voy a hacer es configurarlo un poco más a mi gusto. La primera cosa es en el menú "Opciones" hay un "configurar Idle"... Y lo primero que me interesa cambiar es el tipo de letra. Me propone tipo de letra Courier New, que es muy fina, y además me la propone en tamaño 12. Yo voy a usar por ejemplo la "DejaVu Sans Mono", que es más gruesa, con lo cual resultará más fácil de leer, y, como quiero que se vea bien en el video, voy a usar un tamaño bastante más grande, voy a poner el tamaño, por ejemplo, 16.

Simplemente con eso ya ganaríamos bastante en legibilidad. Pero además, a mí me resulta más cómodo, como trabajo muchas veces de noche, un fondo oscuro, con lo cual me voy a "Highlights" y aquí aparece como tema el "Idle classic" y yo voy a decir que quiero el "Idle Dark". Si ahora guardo los cambios, tengo un entorno con letra más grande, más fácil de leer y con fondo negro.

Ahora ya sí, vamos a crear una nueva ventana... Quiero un "New file"...

Pues bien, para manejar un fichero tendremos que dar siempre tres pasos.

  • El primer paso será abrirlo.

  • Luego leeremos información o guardaremos información

  • Finalmente deberemos cerrarlo para asegurarnos de que esa información se vuelque realmente a fichero.

Si olvidamos cerrar, es muy habitual que tengamos un fichero que no quede utilizable, un fichero con tamaño cero bytes, al que no se habrá llegado a volcar la información.

¿Cómo se hace eso en Python?

Pues crearé una variable, que puedo llamar, por ejemplo, "fichero" y esa variable será el resultado de abrir, y a ese "open" se le indican dos parámetros: se le indica el nombre de fichero y se le indica el "modo" de apertura. Nombre de fichero por ejemplo, vamos a crear uno que se llame ejemplo1.txt

Y como modos, tenemos dos especialmente habituales y uno un poco menos habitual:

  • Vamos a empezar por crear ficheros, con lo cual nuestro modo será "w". W es el modo de escritura, W es la abreviatura de Write.

  • Cuando ya hayamos creado un fichero y lo queramos leer, usaremos el modo "r". R es la abreviatura de "Read".

  • Y el tercer modo, que es algo menos habitual, es el modo de añadir, que se indica con la a de "Append". porque si yo vuelvo a lanzar este programa una segunda vez, destruiré el fichero original. Cada vez que vuelvo a lanzar un programa que tenga el método "w", el fichero, si existiera anteriormente, se destruye. Si yo quiero ir añadiendo más datos y más datos al final, tendré o que guardar todo el bloque de información (a la vez), o que usar el modo "a", el modo de añadir.

En nuestro caso, insisto, vamos a abrir el fichero, terminaremos siempre cerrando el fichero y entre medias escribiremos o leeremos, insisto: empezamos por escribir, con lo cual pondré en mi fichero, escribir (write) y vamos a poner, por ejemplo, un 1.

fichero = open("ejemplo1.txt", "w")
fichero.write(1);
fichero.close()

Si quieres, para que se vea más claro que es un fichero de texto, fuerzo a que sea texto, poniendo comillas, pero este detalle no es importante.

fichero = open("ejemplo1.txt", "w")
fichero.write("1");
fichero.close()

Y voy a escribir un segundo texto, para que veas una segunda peculiaridad, que es importante: que cuando yo mande datos tendré que indicar dónde quiero un salto de línea; si no, quedará todo en la misma línea.

fichero = open("ejemplo1.txt", "w")
fichero.write("1")
fichero.write("2")
fichero.close()

Vamos a probar este programa. Primero, ya sabes, me pedirá que lo guarde, con lo cual lo guardaré en mi escritorio. Así, mi fichero "ejemplo1.txt" quedará en el escritorio. Voy a Run... Digo que sí, que lo quiero guardar. Lo he guardado en el escritorio con el nombre "ficheros1.py" y entonces... la ejecución simplemente me avisa de que ha terminado, pero no me dice nada más, porque mi programa no decía nada más. Cerramos esta ventana y verás que mi programa, en ningún momento decía nada en pantalla, sólo mandaba a fichero.

Vamos a comprobar la apariencia de ese fichero. Le he puesto la extensión ".txt" para que me fuera fácil abrirlo con el bloc de notas, o con cualquier otro editor que reconozca ficheros de texto, pero no hay por qué hacerlo así, yo podría haber puesto, en vez de .txt, punto... cualquier otra cosa, sólo que entonces no podría abrirlo con doble clic con el bloc de notas, tendría que decirle "esto quiero que me lo abras con tal editor".

12

En cualquier caso, lo que vemos es que en mi fichero están el 1 y el 2, pero están en la misma línea

¿Qué hago si quiero escribir datos en distintas líneas? Pues lo que haremos es que después de cada dato que queramos que vaya una línea distinta, pondremos barra invertida ene (\n)

Por ejemplo, yo podría poner esto:

fichero = open("ejemplo1.txt", "w")
fichero.write("1\n")
fichero.write("2\n")
fichero.close()

O mejor aún, esto:

fichero = open("ejemplo1.txt", "w")
fichero.write("1\n2\n")
fichero.write("3")
fichero.write("4\n")
fichero.write("5")
fichero.close()

Lo guardo con un nombre nuevo. Voy a Fichero... Guardar como... Ahora que está ya está guardado, lo ejecuto y ya no me preguntará si lo quiero guardar. Y si ahora abro el fichero ejemplo1.txt...

1
2
34
5

Insisto, como estoy en modo de escritura, modo "w", se ha reemplazado el fichero original, he perdido su contenido y ahora tengo 1 y 2 en líneas distintas, 3 y 4 en la misma línea. 5 en línea distinta. El 3 y el 4 en la misma línea, insisto, es por este detalle, porque después del 3 no hay "barra n" y en cambio 1 y 2 que he escrito a la vez, como los dos tienen detrás un "barra n", sí que han salido en líneas distintas.

En el mundo real es muy habitual que lo que hagamos sea guardar datos que procedan de listas o cosas por el estilo, con lo cual es muy frecuente, usar una orden "for". Aquí voy a usarla, pero para escribir datos prefijados. Pondré "quiero valores para i que van a estar en el rango, por ejemplo desde 1 hasta 10, y para esos valores, lo que quiero es, en mi fichero quiero escribir... "Línea", a esa palabra "línea" le concatenaríamos el número y un salto de línea, pero aquí hay dos comentarios que hacer.

for i in range(1, 11):
    fichero.write("linea " + i + "\n")

Por una parte, si quieres que sea del 1 al 10, recuerda que tienes que terminar en 11, porque el dato final de un "range" no se incluye. Y para seguir, aquí estamos concatenando un texto con un número y con otro texto. Eso, muchos lenguajes lo permiten y entonces directamente este número se convierte a cadena de texto, pero en Python eso no es así, con lo cual en Python tenemos que ponerle "str" de i: "str(i)" quiero decir "ese entero i, quiero que me lo conviertas a cadena". Igual que tenemos un "int" para convertir lo que el usuario tecleaba a número, tenemos un "str" para convertir un número a cadena, son procesos inversos.

El programa completo quedaría:

fichero = open("ejemplo2.txt", "w")
for i in range(1, 11):
    fichero.write("linea " + str(i) + "\n")
fichero.close()

Lo lanzamos... Al igual que antes, no hemos mostrado nada en pantalla, todo se manda fichero, pero podemos abrir ese fichero y verás que contiene línea 1, Línea 2, línea 3... así hasta línea 10.

Pues esta sería otra forma muy habitual de guardar información en fichero: no mandar dato a dato, sino usar un "for" para recorrer una lista de datos que ya exista. De hecho, la forma más habitual de leer un fichero consiste precisamente en leer todo el contenido y guardarlo en una lista o en un "array", según lo quieras ver. Por ejemplo, yo lo que que haría es decir "quiero mi fichero ejemplo2, pero lo quiero abrir para lectura". recuerda con la letra R (de Read) y lo que haríamos es, en vez de usar un "for": decir las líneas de ese fichero van a ser el resultado de fichero.readlines

Y sólo con eso se rellena un array, ya sabes, una lista, que contiene todo lo que había en ese fichero. Para comprobarlo, podemos después mostrar el contenido de todas esas líneas:

fichero = open("ejemplo2.txt", "r")
lineas = fichero.readlines()
fichero.close()

print(lineas)

Lo guardamos como un hombre nuevo, como siempre. Y lo ejecutamos. Verás que tenía línea 1 barra ene, línea 2 barra ene, línea 3 barra ene... y así hasta línea 10 barra ene. Y todo ello entre corchetes, porque es una lista de datos.

Para terminar, también podemos hacer el paso contrario, también podemos crear un fichero a partir de una lista de líneas. En este caso diríamos quiero un fichero. ejemplo3, quiero escribir en él... lo que haría es prepararme mi lista anteriormente, decir "mi línea va a ser igual a, entre corchetes y entre comillas... uno dos... Todos los datos que yo quisiera y recuerda que si quieres que salgan en línead separadas en el fichero, cada uno de ellos tendrá que terminar con barra n: 2 barra n, 1 barra n, 3 barra n. Y entonces lo que haría es decir "en mi fichero quiero que me escribas líneas", no que me leas líneas, "writelines". ¿Cuáles? Esas que he preparado en mi variable "líneas".

fichero = open("ejemplo3.txt", "w")
lineas = ["Uno\n", "Dos\n", "Tres\n"]
fichero.writelines( lineas )
fichero.close()

En este caso estoy creando un fichero de escritura, me he preparado una lista de líneas y estoy volcando esa lista de líneas, en vez de ir volcando un dato y luego otro y luego otro. Como siempre, guardo con otro nombre para no machacar el fichero anterior.

Para ejecutar, vamos al menú Run o directamente pulsamos la tecla F5 y al igual que antes no escriben nada en pantalla, simplemente nos dice que ha terminado, con lo cual vamos a abrir ese fichero y verás que el fichero contiene tres líneas que son "Uno", "Dos" y "Tres", porque en cada una de ellas hemos terminado con barra n.

Uno
Dos
Tres

Si yo pusiera un barra n, por en medio de la palabra "Dos", a pesar de que esta lista tiene tres datos, al fichero irían cuatro líneas: la línea que pone 1, la línea que pone D la línea que pone o s y la línea que pone 3. Vamos a comprobarlo...

fichero = open("ejemplo3.txt", "w")
lineas = ["Uno\n", "D\nos\n", "Tres\n"]
fichero.writelines( lineas )
fichero.close()

Pulso F5. Y vuelvo a abrir el resultado. Y vieras que tengo uno, D, O S y tres, es decir, que el número de líneas de fichero no depende de cuántos datos haya en mi lista original, sino de cuántos "barra n" yo haya intercalado, que son lo que fuerza los saltos de línea en el fichero.

Uno
D
os
Tres

Sólo queda el detalle adicional de que si en vez de un W pongo una A, lo que haré es añadir al final de ese fichero que ya existe, vamos a comprobarlo.

Voy a poner en la primera línea, por ejemplo, "Cuatro", para que no sea exactamente lo mismo.

fichero = open("ejemplo3.txt", "a")
lineas = ["Cuatro\n", "D\nos\n", "Tres\n"]
fichero.writelines( lineas )
fichero.close()

Y vuelvo a lanzar.

Uno
D
os
Tres
Cuatro
D
os
Tres

Y ahora, como hemos añadido al final del fichero, han aparecido estas líneas nuevas: el "Cuatro", el "Dos" dividido en dos líneas y el "Tres" porque hemos abierto con el modo "append", el modo de añadir, con lo cual ha visto que existía el fichero y añadido al final de él, en vez de destruirlo por completo, sobreescribiéndolo con el nuevo contenido.

Ejercicio propuesto 12.1. Pide al usuario 3 frases y guárdalas en un fichero "frases.txt".

Ejercicio propuesto 12.2. Añade una cuarta frase al fichero anterior.

Ejercicio propuesto 12.3. Muestra el contenido de "frases.txt", precediendo cada línea con un número correlativo.

2863 visitas desde el 15-08-2020

AnteriorPosterior