Fundamentos de la Programación

#11 – Ficheros

Llegados a este punto, prácticamente podemos dar por finalizado el curso «Fundamentos de la Programación«. Hemos aprendido a programar, y con nuestros conocimientos somos capaces de afrontar la gran mayoría de problemas que se nos podrían presentar. Pero ocurre una cosa, y es que, cuando finaliza nuestro programa, toda la información se pierde. ¿No sería genial poder guardar todo el trabajo realizado? Pues para eso existen los ficheros.

Ficheros de Texto

Un fichero es algo en lo que podemos escribir y/o leer información. Siempre que los utilicemos, hemos de asegurarnos de seguir unos pasos:

  1. Abrir el fichero indicando su ruta. Esta puede ser Relativa (comienza en la carpeta de nuestro programa) o Absoluta (comienza en la raíz del sistema de ficheros (la letra de la unidad en Windows, / en los sistemas Unix)).
  2. Leer o escribir la información que se desee del fichero.
  3. Cerrar el fichero. Es de vital importancia cerrar el fichero. De no hacerlo, es posible que los cambios efectuados se pierdan o, en el peor de los casos, que le fichero se corrompa.

A la hora de abrir ficheros, poseemos distintos modos para ello:

  • Lectura: nos permite leer la información del fichero, pero no modificarla ni añadir nueva información.
  • Escritura: sólo nos permite escribir información en el fichero. Por defecto, borra todo el contenido previo del mismo.
  • Lectura y Escritura: permite leer y escribir información en el fichero.
  • Adición: permite añadir nueva información al fichero, pero no la modificación de la información existente.

Lectura

Línea a Línea

El siguiente código se encarga de leer el contenido de un fichero de texto línea a línea:

#1 - ABRIR FICHERO
fichero = open("fich.txt", "r")

#2 - LEER FICHERO  
for linea in fichero:
    print(linea)
    
#3 - CERRAR FICHERO
fichero.close()

Para abrir un fichero, utilizamos la función open(). Esta función recibe dos parámetros: la ruta del fichero y el modo de apertura. En este caso, la ruta es relativa (el fichero se encuentra en la misma carpeta que nuestro programa) y se abre en modo lectura «r» (read).

Para leer el contenido del fichero, nos valemos del práctico bucle for-in. Con cada iteración guardaremos una nueva línea en la variable «linea» y se mostrara por pantalla.

Finalizamos cerrando el fichero mediante la función close(). Recordad la importancia de siempre cerrar los ficheros.

La ejecución del anterior código sobre el fichero:

Línea 1
Línea 2
Línea 3

genera la siguiente salida por pantalla:

Línea 1

Línea 2

Línea 3

¿Eh? ¡Han aparecido líneas en blanco tras cada lectura! Esto se debe a que, en el propio fichero, las líneas finalizan con un salto de línea (carácter \n). A esto se le suma el propio salto de línea que escribe la función print(). Esto se soluciona modificando el programa para que omita el último carácter de una línea si este es un salto de línea:

#1 - ABRIR FICHERO
fichero = open("fich.txt", "r")

#2 - LEER FICHERO  
for linea in fichero:
    if linea[-1] == '\n':
        linea = linea[:-1]
    print(linea)
    
#3 - CERRAR FICHERO
fichero.close()

En este código vemos la aparición de un concepto nuevo, el operador :. Este operador sirve para cualquier tipo de lista (recordad que las cadenas son una subespecie de lista). Su funcionamiento es simple, se encarga de truncar la lista desde una posición inicial hasta una final. En este caso, se muestra la cadena desde la primera posición (por defecto al no escribir nada), hasta la penúltima posición (se elimina la posición -1).

Otra opción para leer línea a línea es utilizar la función readline(). Esta nos devuelve una línea completa del fichero, o una cadena vacía si no quedan líneas para leer. Nuestro anterior código quedaría así:

#1 - ABRIR FICHERO
fichero = open("fich.txt", "r")

#2 - LEER FICHERO 
linea = fichero.readline()
while linea != '':
    if linea[-1] == '\n':
        linea = linea[:-1]
    print(linea)
    linea = fichero.readline()
    
#3 - CERRAR FICHERO
fichero.close()

Fijaos que la primera línea se ha leído fuera del bucle. ¿Comprendéis por qué?

Carácter a Carácter

A veces leer una línea completa puede que no nos interese. Para ello disponemos de la función read(). Esta función lee un número determinado de caracteres. Veamos el ejemplo anterior, pero leyendo carácter a carácter:

#1 - ABRIR FICHERO
fichero = open("fich.txt", "r")

#2 - LEER FICHERO 
linea = ''
caracter = fichero.read(1)
while caracter != '':
    if caracter == '\n':
        print(linea)
    linea += caracter
    caracter = fichero.read(1)
    
#3 - CERRAR FICHERO
fichero.close()

Tratamiento de Errores

En Python, si intentamos abrir un fichero que no existe, obtendremos un error y la ejecución del programa finalizará (en otros lenguajes se crea el fichero). Para evitar eso, conviene tratar el error. El tratamiento de errores mediante la captura de excepciones es algo avanzado que no se va a ver en este curso, pero conviene memorizar lo relativo a la apertura de ficheros.

try:
    #CÓDIGO QUE QUEREMOS EJECUTAR
    fichero = open("fich.txt", "r")
    for linea in fichero:
        if linea[-1] == '\n':
            linea = linea[:-1]
        print(linea)
    fichero.close()

except IOError:
    #CÓDIGO EN CASO DE NO EXISTIR EL FICHERO
    print("El fichero no existe.")

Escritura

Para escribir información en un fichero, utilizamos la función write(). Previamente, dicho fichero ha debido ser abierto en modo escritura, «w» (write). No olvidéis que al abrir un fichero en modo escritura, su contenido se borra. El siguiente código copia el contenido de un fichero en otro:

fichero = open("fich.txt", "r")
copia = open("copia.txt", "w")

for linea in fichero:
    copia.write(linea)
    
fichero.close()
copia.close()

Modo Adición

Si lo que queremos es añadir información a un fichero ya existente, sin borrar el contenido del mismo, debemos abrir el fichero en el modo de adición, «a» (append). Este modo realiza las escrituras al final del fichero.

Ficheros en OnlineGDB

Utilizar ficheros en OnlineGDB es igual de sencillo que la creación de módulos. Simplemente tenemos que tener abierto el fichero que vayamos a usar en una nueva pestaña dentro del intérprete.


Con esto finalizamos todo el contenido teórico del curso. Recordad que tenéis disponibles los ejercicios por si todavía no los habéis hecho, incluido el nuevo ejercicio 13 para profundizar sobre el uso de ficheros.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

back to top