Entrada

Leer y escribir archivos de texto

En este post, vamos a comenzar a trabajar con la Memoria Secundaria (o archivos).

Nos vamos enfocar principalmente en leer y escribir archivos como los que creamos en un editor de texto. Más adelante veremos cómo trabajar con archivos de bases de datos, que son archivos binarios diseñados específicamente para ser leídos y escritos a través de software para el manejo de bases de datos.

Cuando queremos abrir un archivo (digamos, en el disco duro), primero debemos abrir el archivo. Al abrir el archivo nos comunicamos con el sistema operativo, el cual sabe dónde están almacenados los datos de cada archivo. Cuando abres un archivo, le estás pidiendo al sistema operativo que encuentre el archivo por su nombre y se asegure que existe.

Abrir archivos

Es importante dominar los conceptos de ruta relativa y ruta absoluta para trabajar con archivos.

Para abrir un archivo, Python nos brinda la función open() que recibe como argumento la ruta del archivo que queremos manejar como un string y como segundo argumento el modo de apertura también como un string.

Ejemplo

1
2
3
4
5
>>> manejador = open('file.txt')
>>> manejador
<_io.TextIOWrapper name='file.txt' mode='r' encoding='cp65001'>
>>> type(manejador)
<class '_io.TextIOWrapper'>

Si el resultado de la función open() es exitoso, el sistema operativo nos devuelve una instancia de TextIOWrapper que es una clase en el módulo io de Python que se utiliza para manejar flujos de entrada/salida de texto, que en este caso lo estamos asignando a una variable llamada manejador. El manejador de archivo no son los datos contenidos en el archivo, sino un manejador (handler) que podemos usar para leer los datos.


Leer un archivo

Para leer un archivo sabemos que lo primero es abrir el respectivo archivo usando la función open(), si nos ponemos a pensar en una lista de amigos que tenemos en un archivo de texto llamado amigos.txt con el siguiente contenido:

1
2
3
4
Marco
Luis
Gabriel
Alejandro

read()

Luego de usar la función open, abrimos el archivo en modo lectura (si no le pasamos un segundo argumento a la función open() por defecto es modo lectura) y usamos el método read() del manejador:

1
2
3
>>> manejador = open('amigos.txt')
>>> manejador.read()
'Marco\nLuis\nGabriel\nAlejandro'

Este método read() lee todo el contenido del archivo como una sola cadena de texto. Puede ser útil para archivos pequeños.

Una vez ejecutado el método read() del manejador si no se guarda el resultado en una variable, se debe volver a posicionar el puntero al inicio (usando el método seek(0) del maneajor).

read(size)

El método read() si se le pasa el argumento size lee esa cantidad de bytes. Si se omite lee todo el el contenido restante del archivo.

1
2
3
4
5
>>> manejador = open('amigos.txt')
>>> manejador.read(10)
'Marco\nLuis'
>>> manejador.read()
'\nGabriel\nAlejandro'

readline()

El método readline() lee una sola línea del archivo. Es útil para leer archivos línea por línea

1
2
3
4
5
6
7
>>> manejador = "amigos.txt"
>>> manejador.readline()
'Marco\n'
>>> manejador.readline()
'Luis\n'
>>> manejador.readline()
'Gabriel\n'

readlines()

El método readlines() lee todas las líneas del archivo y las devuelve como una lista de cadenas, donde cada línea es un elemento de la lista.

1
2
3
>>> manejador = "amigos.txt"
>>> manejador.readlines()
['Marco\n', 'Luis\n', 'Gabriel\n', 'Alejandro']

Escritura de un archivo

Para escribir texto en un archivo hay que abrir el archivo en modo escritura. Para ello utilizamos el argumento adicional en la función open() que se indica en la siguiente operación:

1
manejador = open('amigos.txt', 'w')

write()

Luego usaremos el método write() del manejador para escribir en el archivo anterior:

1
2
manejador = open('amigos.txt', 'w')
manejador.write("Juan")

Si revisamos el archivo amigos.txt nos encontraremos con la sorpresa de que se sobreescribio el contenido:

1
Juan

Esto sucede porque el segundo argumento 'w' se refiere al modo de solo escritura, por lo que los datos existentes en el archivo de modifican y sobrescriben y si el archivo aún no existe, se crea uno nuevo. Por otro lado no podemos leer el archivo usando el método read() si quisieramos leer el archivo debemos usar 'w+' para cambiar al modo de escritura y lectura.

Escribir al final de un archivo

Tenemos entonces ahora el modo de solo agregar (append) 'a' que nos permite abrir el archivo para escritura y de la misma forma que 'w' si el archivo aún no existe, se crea uno nuevo. La diferencia es que en este modo el cursor del manejador se establece al final del archivo y así los datos recíen escritos se agregarán al final, manteniendo los datos escritos anteriormente:

1
2
3
manejador = open('amigos.txt', 'a')

manejador.write("\nJuan") # '\n' es para generar un salto de línea 

Al igual que en el caso anterior, si queremos además leer el archivo debemos cambiar al modificador 'a+'.

writelines()

El método writelines() nos permite escribir múltiples líneas a la vez. Ejemplo:

1
2
3
>>> lineas = ['Primera línea\n', 'Segunda línea\n', 'Tercera línea\n']
>>> with open('archivo.txt', 'w') as archivo:
...     archivo.writelines(lineas)

Propiedades del objeto file

Además de los diferentes métodos que podemos acceder desde el objeto File, también podemos acceder a diferentes propiedades para conocer más sobre el objeto que estamos utilizando.

Se pueden acceder a las siguientes propiedades:

  • closed: retorna True si el archivo se ha cerrado, en caso contrario será False.
  • mode: retorna el modo en el que fue abierto el archivo.
  • name: retorna el nombre del archivo.
  • encoding: retorna la codificación de caracteres del archivo.

Podemos ver un ejemplo

1
2
3
4
5
6
7
manejador = open("amigos.txt", "a+")
content = manejador.read()
nombre = manejador.name # 'amigos.txt'
modo = manejador.mode # a+
encoding = manejador.encoding # cp1252
manejador.close()
manejador.closed # True

Utilizando la estructura with

La estructura with es una estructura de control, Python define a la estructura with como un administrador de contexto (context manager).

Un ejemplo sería:

1
2
with open("ejemplo.txt", "r") as archivo:
  content = archivo.read()

Utilizar esta estructura es que nos cerrará automáticamente el objeto sin necesidad de tener que llamar explícitamente al método close() para cerrarlo manualmente.


Manejando excepciones usando with

Este apartado requiere haber estudiado sobre Menejo de excepciones

El uso de with resuelve problemas y puede lidiar de mejor manera con objetos que utilizan recursos externos. Es una excelente combinación el uso de with con el manejo de excepciones con las cláusulas try except.

Un ejemplo muy típico es intentar abrir un archivo, pero capturar una posible excepción.

Veamos el ejemplo

1
2
3
4
5
6
7
8
# Se intenta abrir un archivo y se captura una posible excepción
try:
  with open('archivo.txt') as file:
    read_data = file.read()
    print(read_data)
except:
  # Se entra aquí si no pudo ser abierto
  print('No se pudo abrir')

Consideraciones adicionales

Manejo de excepciones
Siempre es buena práctica manejar posibles excepciones cuando se trabaja con archivos. Puedes usar try y except para capturar errores como FileNotFoundError o IOError.

Mi lema es

Esta entrada está licenciada bajo CC BY 4.0 por el autor.