Tu blog de tutoriales Python en habla hispana
Logotipo de Python con la palabra fundamentos a su derecha.

Leer y Escribir Ficheros de Texto

Trabajar con ficheros de texto en Python no es una tarea complicada. En primer lugar tenemos que abrir/crear el fichero con el que vamos a trabajar. Con el fichero abierto podemos leer y/o escribir nuevo contenido según nos convenga. Una vez terminado, es una buena práctica cerrar el fichero para evitar posibles errores con otros programas. En este post vamos a aprender como realizar estos pasos, así como las funciones y objetos que nos proporciona Python para estas tareas.

Abrir el fichero

Abrir el fichero consiste en indicarle a Python con qué fichero deseamos trabajar y qué deseamos hacer con ese fichero. Es una operación similar a la opción ArchivoAbrir que podemos encontrar en cualquier aplicación de escritorio con una interfaz gráfica. En Python para abrir un fichero se utiliza la función open(). Esta función retorna un handler que podemos utilizar para realizar operaciones en el fichero. La función open() se utiliza del siguiente modo:

handle = open(fichero, modo)

  • Handle: es el objeto que se utiliza para trabajar con el fichero. Hay que entenderlo como una conexión entre la memoria del ordenador, donde se ejecuta nuestro código Python, y el disco, que es donde reside el fichero.
  • Fichero: es un String con el nombre del fichero. Si no indicamos ninguna ruta de archivo se entiende que el fichero de texto reside en la misma carpeta del código Python que estamos ejecutando, pero si intentamos leer un fichero que no existe obtenemos un error del tipo FileNotFoundError que nos indica que el fichero no se ha encontrado.
  • Modo: es un parámetro opcional para indicar qué operaciones deseamos realizar. Aunque hay varios modos disponibles, la siguiente tabla muestra los más relevantes.
CaracterSignificado
rLeer (es el modo por defecto)
wEscribir, eliminando antes el contenido del fichero
aEscribir, añadiendo el nuevo contenido al final del fichero
r+Leer y escribir
w+Leer y escribir. Si el fichero no existe lo crea, en caso que exista elimina su contenido

Introducir el nombre del archivo y tratar posibles errores

En el caso que en un script Python queramos introducir el nombre del fichero desde el terminal, podemos ayudarnos del método input(). Este método transforma la entrada por teclado en una cadena de texto. Pero si queremos leer un fichero y proporcionamos un nombre no existente podemos tratar el error FileNotFoundError con un bloque try except.

nombre_archivo = input('Introduce el nombre del archivo: ')
try:
    handler = open(nombre_archivo)
except FileNotFoundError:
    print('Archivo no encontrado:', nombre_archivo)
    exit()

Leer los contenidos del fichero

Los contenidos de un fichero de texto se pueden leer de dos modos distintos: línea a línea o completa. Para explicar como funciona cada modo, supongamos que queremos leer un fichero llamado test.txt con el siguiente contenido.

Esto es un fichero de texto
Una nueva línea de texto
La tercera línea del fichero

El carácter de salto de línea

Si nos fijamos en el contenido del fichero de texto test.txt podemos ver que consta de tres líneas de texto. El salto de una línea a otra se realiza con un carácter especial invisible pero existente que se representa en código como barra invertida + n (\n). En los siguientes apartados vamos a ver como este carácter afecta a la lectura del fichero.

Lectura del fichero línea a línea

Podemos leer un fichero de texto línea por línea usando un bucle for. En el siguiente ejemplo se imprimen por pantalla cada una de las líneas del fichero:

>>> handler = open('test.txt')
>>> for linea in handler:
...     print(linea)
... 
Esto es un fichero de texto

Una nueva línea de texto

La tercera línea del fichero

El espaciado entre líneas es debido al carácter de salto de línea. Pero teniendo en cuenta que linea es un objeto de tipo String, podemos usar el método rstrip() para eliminar este carácter y mostrar los contenidos de manera más elegante.

>>> handler = open('test.txt')
>>> for linea in handler:
...     print(linea.rstrip())
... 
Esto es un fichero de texto
Una nueva línea de texto
La tercera línea del fichero

Lectura completa del fichero

Para leer el contenido de un fichero de golpe tenemos que usar el método read() del handler, el cual nos retorna dicho contenido como una cadena de texto. Como se muestra en el siguiente ejemplo, los saltos de línea vienen representados con el carácter \n.

>>> handler = open('test.txt')
>>> contenido = handler.read()
>>> type(contenido)
<class 'str'>
>>> contenido
'Esto es un fichero de texto\nUna nueva línea de texto\nLa tercera línea del fichero'

Si leemos el contenido del fichero dos veces, en la segunda vez obtenemos una cadena vacía. Esto es debido a que el handler tiene un cursor que al aplicar el método read() colocamos al final del fichero.

>>> handler = open('test.txt')
>>> contenido = handler.read()
>>> contenido = handler.read()
>>> contenido
''

En el caso que queramos utilizar el método read() varias veces, podemos colocar el cursor al principio con el método seek(posicion), siendo el índice del carácter donde colocamos el cursor.

>>> handler = open('test.txt')
>>> contenido = handler.read()
>>> contenido = handler.read()
>>> handler.seek(0)
0
>>> contenido = handler.read()
>>> contenido
'Esto es un fichero de texto\nUna nueva línea de texto\nLa tercera línea del fichero\n'

Otra alternativa para hacer una lectura completa del fichero es utilizar el método readlines(), el cual nos retorna una lista donde cada elemento se corresponde con una línea del fichero. Así pues, este método nos permite acceder a las distintas líneas del fichero tal y como lo hacemos en una lista.

>>> handler = open('test.txt')
>>> contenido = handler.readlines()
>>> type(contenido)
<class 'list'>
>>> contenido[1]
'Una nueva línea de texto\n'

Escribir contenido en el fichero

Para escribir en un fichero de texto, aparte de abrir el fichero con el modo correspondiente, tenemos que usar el método write() que nos proporciona el handler. Como se muestra en el siguiente bloque de código, si abrimos el fichero test.txt que hemos usado en el apartado anterior en modo ‘a’ (append), añadimos las nuevas líneas que escribimos a las ya existentes.

>>> handler = open('test.txt', 'a')
>>> handler.write('Línea escrita con el método write')
33
>>> handler.close()
>>> handler = open('test.txt', 'r')
>>> handler.read()
'Esto es un fichero de texto\nUna nueva línea de texto\nLa tercera línea del fichero\nLínea escrita con el método write'

En cambio, si ahora abrimos el fichero en modo ‘w’ (write), el contenido actual del fichero se elimina y al final el fichero sólo contiene las líneas de texto que hemos escrito con el método write().

>>> handler = open('test.txt', 'w')
>>> handler.write('Línea escrita con el método write')
33
>>> handler.close()
>>> handler = open('test.txt', 'r')
>>> handler.read()
'Línea escrita con el método write'

Escribir un fichero de texto en Jupyter Notebook

En el caso de que usemos Jupyer Notebook podemos ayudarnos del comando especial %%writefile junto con el nombre del fichero donde queremos guardar el contenido.

%%writefile ejemplo.txt
Este método sólo funciona
si utilizamos
Jupyter Notebook

Cerrar el fichero

Como acabamos de ver en los dos primeros bloques de código del apartado anterior, para realizar la operación de escritura tenemos que cerrar el fichero con el método close(). Esto además evita que se produzcan interferencias con otros programas. Una alternativa a este método es utilizar la palabra clave with la cual se encarga de cerrar el fichero automáticamente una vez hemos terminado.

with open("test.txt") as handler:
    contenido = handler.read()
    # procesar el contenido

Deja un comentario

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

nueve + cinco =