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 Archivo → Abrir 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.
Caracter | Significado |
---|---|
r | Leer (modo por defecto) |
w | Escribir, eliminando antes el contenido del fichero |
a | Escribir, 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
contenido claro, facil de entender. Excelente
Gracias Argenis 🙂