79 - Archivos de texto: creación, escritura y lectura

Una actividad muy común en un programa es el almacenamiento y recuperación de datos almacenado en un dispositivo secundario (disco duro).

Existen muchos modos de almacenar datos como son los archivos de texto, archivos binarios, bases de datos etc.

Veremos en este concepto como almacenar y recuperar datos de un archivo de texto.

Archivo de texto

Un archivo de texto contiene un conjunto de caracteres estructurados en distintas líneas. Es un formato de archivo ampliamente utilizado como pueden ser:

  • El código fuente de un script en Python se almacena en un archivo de texto (igual que cualquier otro lenguaje de programación)
  • Archivos HTML, CSS, XML se almacenan en archivos de texto.
  • Archivos JSON etc.

Creación de un archivo de texto y almacenamiento de datos.

Como es una actividad tan común en todo programa el lenguaje Python incluye por defecto todas las funcionalidades para trabajar con archivos de texto.

Veamos con un ejemplo como crear y almacenar caracteres en un archivo de texto.

Problema:

Crear un archivo de texto llamado 'datos.txt', almacenar tres líneas de texto. Abrir luego el archivo creado con un editor de texto.

Programa: ejercicio267.py

Ver video

archi1=open("datos.txt","w") 
archi1.write("Primer línea.\n") 
archi1.write("Segunda línea.\n") 
archi1.write("Tercer línea.\n")  
archi1.close() 

Luego de ejecutar este programa (no muestra nada por pantalla) debemos abrir con un editor de texto el archivo de texto que se acaba de crear llamado 'datos.txt':

archivo de texto Python

Para crear un archivo de texto debemos llamar a la función open y pasar dos parámetros, el primero indica el nombre del archivo a crear y el segundo un string con el caracter "w" (la "w" write indica crear el archivo de texto):

archi1=open("datos.txt","w") 

Si el archivo 'datos.txt' ya existe luego se crea uno nuevo y se borra el actual.

El archivo se crea en la misma carpeta donde se está ejecutando el script de Python, si necesitamos que se cree en otra carpeta podemos indicar el path del mismo:

archi1 = open("c:/administracion/datos.txt","w") 

Si indicamos un path inexistente se genera un error.

Para grabar caracteres en el archivo de texto utilizamos el método 'write' y le pasamos un string a grabar:

archi1.write("Primer línea.\n") 

Mediante la sintaxis \n indicamos que debe almacenarse un salto de línea en el archivo de texto.

Si no incluimos los respectivos \n:

archi1.write("Primer línea.") 
archi1.write("Segunda línea.") 
archi1.write("Tercer línea.")  

El archivo de texto tiene una sola línea:

archivo de texto Python

Luego de trabajar con el archivo de texto debemos liberarlo para que otro programa pueda acceder a su contenido:

archi1.close() 

Lectura de un archivo de texto.

Ver video

Problema:

Leer el contenido del archivo de texto 'datos.txt'.

Programa: ejercicio268.py

archi1=open("datos.txt","r")
contenido=archi1.read()
print(contenido)
archi1.close()

Luego de ejecutar este programa:

lectura archivo de texto Python

Llamamos a la función 'open' y le pasamos el nombre del archivo a leer y un string con el caracter "r" (read):

archi1=open("datos.txt","r")

El método 'read' recupera todas las líneas del archivo de texto (recupera el archivo completo):

contenido=archi1.read()

Luego de trabajar con el archivo de texto debemos liberarlo para que otro programa pueda acceder a su contenido:

archi1.close() 

El método 'read' sin parámetros retorna todos los caracteres almacenados en el archivo, opcionalmente podemos pasar un entero que represente la cantidad de caracteres a leer:

archi1=open("datos.txt","r")
contenido=archi1.read(6)
print(contenido) # imprime: Primer
archi1.close()

Lectura de un archivo de texto línea a línea.

En algunas situaciones podemos necesitar leer el contenido de un archivo de texto línea a línea. Disponemos de un método llamado 'readline' que lee una línea completa del archivo, inclusive retorna el caracter '\n' de fin de línea.

Problema:

Leer el contenido del archivo de texto 'datos.txt' línea a línea.

Programa: ejercicio269.py

archi1=open("datos.txt","r")
linea=archi1.readline()
while linea!='':
    print(linea, end='')
    linea=archi1.readline()
archi1.close()

Antes de la estructura repetitiva 'while' leemos la primer lína del archivo de texto:

linea=archi1.readline()

Luego mientras la variable 'linea' sea distinta a un string vacío imprimimos el contenido de la variable 'linea' evitando que genere un salto de línea la función print mediante la asignación del parámetro end con el valor de '':

while linea!='':
    print(linea, end='')
    linea=archi1.readline()

También dentro de la estructura while leemos las siguientes líneas.

Podemos recorrer el archivo leyendo línea a línea utilizando la estructura repetitiva for:

Programa: ejercicio270.py

archi1=open("datos.txt","r")
for linea in archi1:
    print(linea, end='')
archi1.close()

Es una forma más compacta de recorrer cada una de las líneas del archivo de texto.

Almacenar un archivo de texto en una lista

Ver video

Mediante el método 'readlines' podemos recuperar cada una de las líneas del archivo de texto y almacenarlas en una lista.

Problema:

Leer el contenido del archivo de texto 'datos.txt' y almacenar sus líneas en una lista. Imprimir la cantidad de líneas que tiene el archivo y su contenido.

Programa: ejercicio271.py

archi1=open("datos.txt","r")
lineas=archi1.readlines()
print('El archivo tiene', len(lineas), 'líneas')
print('El contenido del archivo')
for linea in lineas:
    print(linea, end='')
archi1.close()

Mediante la llamada al método 'readlines' obtenemos una lista con todas las líneas del archivo 'datos.txt':

lineas=archi1.readlines()

Imprimimos seguidamente la cantidad de elementos de la lista que coincide con la cantidad de líneas que tiene el archivo de texto:

print('El archivo tiene', len(lineas), 'líneas')

Para imprimir el contenido del archivo de texto procedemos a imprimir la lista:

print('El contenido del archivo')
for linea in lineas:
    print(linea, end='')

Una variante del método 'readlines' es pasar como un parámetro entero que represente que línea queremos recuperar:

linea=archi1.readlines(2)
print(linea, end='')     # imprime ['Primer línea.\n']

Abrir un archivo de texto para añadir líneas.

Hemos visto que cuando llamamos a la función 'open' el segundo parámetro puede ser "w", "r" y si queremos que se abra para añadir sin borrar las líneas actuales del archivo debemos hacerlo con el parámetro "a" (append).

Problema:

Abrir el archivo de texto 'datos.txt' y luego agregar 2 líneas. Imprimir luego el archivo completo.

Programa: ejercicio272.py

Ver video

archi1=open("datos.txt","a")
archi1.write("nueva línea 1\n")
archi1.write("nueva línea 2\n")
archi1.close()
archi1=open("datos.txt","r")
contenido=archi1.read()
print(contenido)
archi1.close()

Abrimos el archivo 'datos.txt' en modo agregar:

archi1=open("datos.txt","a")

Almacenamos dos líneas en el archivo:

archi1.write("nueva línea 1\n")
archi1.write("nueva línea 2\n")

Cerramos el archivo y lo volvemos a abrir para leer su contenido:

archi1.close()
archi1=open("datos.txt","r")
contenido=archi1.read()
print(contenido)
archi1.close()

Abrir un archivo para leer y agregar datos.

Hay una cuarta forma de abrir un archivo indicando en el segundo parámetro de la función open el string "r+", con dicha opción podemos leer y escribir.

Problema:

Abrir un archivo de texto con el parámetro "r+", imprimir su contenido actual y agregar luego dos líneas al final.

Programa: ejercicio273.py

archi1=open("datos.txt","r+") 
contenido=archi1.read()
print(contenido)
archi1.write("Otra línea 1\n")
archi1.write("Otra línea 2\n")
archi1.close()

Codificación de caracteres utf-8.

Actualmente se utiliza mucho la codificación de caracteres utf-8 la que nos permite representar una infinidad de caracteres de distintos idiomas y símbolos.

En Python debemos indicar cuando abrimos el archivo de texto mediante el parámetro 'encoding' la codificación de caracteres utilizada.

Problema:

Crear un archivo de texto llamado 'datos.txt' con una codificación utf-8, almacenar tres líneas de texto. Abrir luego el archivo creado con el editor VS Code.

Programa: ejercicio274.py

Ver video

archi1=open("datos.txt","w", encoding="utf-8") 
archi1.write("Primer línea.\n") 
archi1.write("Segunda línea.\n") 
archi1.write("Tercer línea.\n")  
archi1.close() 

Si ahora abrimos el archivo de texto creado con un editor que permite trabajar con archivos con codificación utf-8 el resultado es:

archivo de texto Python utf-8