Manipulación de archivos con Python



@eduardo_gpg

Número de visitas 2240

Tiempo de lectura 4 min

13 Julio 2020

Uno de los features que más me gustan de Python es sin duda la facilidad con la cual podemos interactuar con nuestro sistema. Pudiendo así manipular archivos, folders, directorios etc ...

Es por ello que te doy la bienvenida a la primera entrega de esta mini serie de tutoriales donde aprenderemos a cómo manipular nuestros sistema a través de Python. Es sin duda un tema muy interesante, así que te invito a que te quedes. 😋

Para este post en particular aprenderemos a cómo crear y editar archivos del sistema. De forma personal trabajaré con el archivo ips.txt.

Con esta breve introducción, comencemos.

Lectura y escritura de archivos

En Python para nosotros poder leer y crear archivos, debemos hacer uso del la función open. La función recibe cómo argumento la ruta del archivo a utilizar. Opcionalmente, como segundo argumento podemos colocar el modo con el cual trabajaremos el archivo. Por default será lectura ('r').

La función open retorna un objeto de tipo TextIOWrapper.

Si deseamos obtener todo el contenido del archivo, haremos uso del método read.

>>> file_path = 'ips.txt'
>>> file = open(file_path)
>>> type(file)
TextIOWrapper

>>> content = file.read() 
>>> len(content) # Cantidad de caracteres en el archivo
2837
>>> type(content)
str

>>> file.close()

Una muy buena práctica es: Una vez hayamos terminado de utilizar un archivo debemos cerrarlo, esto con la finalidad de liberar espacio en memoria y permitir que otros procesos puedan hacer uso de él.

Una forma muy común de poder leer un archivo es línea por línea, y para ello podemos hacer uso del método readlines. El método retorna una lista de strings. Cada elemento de la lista no es más que una línea dentro del archivo.

>>> file_path = 'ips.txt'
>>> file = open(file_path)

>>> for line in file.readlines():
>>>     print(line)    

143.200.119.151
173.80.163.60
89.228.175.19
...

Siempre que trabajemos con archivos una muy buena idea es utilizar un try y un except, esto para validar cualquier posible error de lectura o escritura. Por ejemplo, si intentamos obtener un archivo que no exista, obtendremos el error : FileNotFoundError.

try:
    file = open('ipss.txt')
    ...
except FileNotFoundError as error:
    print(error)

Podemos adecuar el script para una manejo más flexibles de los archivos.

try:
    file = open('ipss.txt')
except OSError:
    print('No fue posible leer el archivo')
else:
    file.close()

Lectura bajo contexto

Otra forma de leer un archivo, y de hecho mucho más recomendable, es través de with. Veamos un ejemplo, recorramos todas las líneas del archivo ips.txt.

try:
    with open('ips.txt') as file:
        for line in file.readlines():
            print(line)

except OSError:
    print('No fue posible leer el archivo')

Cómo podemos observar, al nosotros trabajar con with, no será necesario cerrar el archivo de forma explícita. Python lo hará una vez el bloque finalice, liberando así el recurso.

De forma personal recomiendo hacer uso de _with_siempre que trabajemos con archivos, de esta forma obtendremos un código mucho más legible y fácil de mantener, además por supuesto de optimizar recursos como lo es el uso de memoria.

Crear archivos

Listo, ya sabemos cargar y obtener el contenido de un archivo, sin embargo ¿Qué pasa si deseamos crear uno nuevo o modificar uno ya existente? Pues bien, en esos casos demos indicar un modo a la función open.

Veamos el listado de modos disponibles.

  • r: Solo lectura (Modo default).
  • rb: Solo lectura binaria.
  • r+: Lectura y escritura.
  • rb+: Lectura y escritura binaria .
  • w: Solo escritura. Si el archivo existe se sobrescribe, en caso contrario se crea.
  • wb: Solo escritura binaria. Si el archivo existe se sobrescribe, en caso contrario se crea.
  • w+: Lectura y escritura. Si el archivo existe se sobrescribe, en caso contrario se crea.
  • wb+: Lectura y escritura binaria. Si el archivo existe se sobrescribe, en caso contrario se crea.
  • a: Añade contenido al final del archivo. Si el archivo no existe se crea.
  • ab: Añade contenido al final del archivo de forma binaria. Si el archivo no existe se crea.
  • a+: Añade y lee. Si el archivo no existe se crea.
  • ab+: Añade y lee de forma binaria. Si el archivo no existe se crea.

Veamos un ejemplo. Creemos el archivo now.txt dentro del sistema. El archivo almacena la fecha en la cual se ejecutó el script. Para ello nuestro código puede quedar de la siguiente manera.

from datetime import datetime

try:
    with open('now.txt', 'w') as file:
        file.write( str(datetime.now()) )

except OSError:
    print('No fue posible crear el archivo')

Listo, ahora ¿Qué te parece si trabajamos con un pequeño ejercicio para reforzar lo aprendido?

Por ejemplo: Desarrolla un programa en Python que escriba, cada segundo, la fecha actual en el archivo: dates.txt. El programa deberá cumplir con los siguiente requerimientos.

  • En caso el archivo dates.txt no exista, el programa deberá crearlo.
  • Cada línea dentro del archivo corresponde a una nueva fecha.
  • Cada fecha deberá ser añadida al final del archivo.
  • En caso el archivo ya exista y posea contenido, las nuevas fechas deberán añadirse al final.

Con todos los conocimientos adquiridos hasta ahora, completar este ejercicio no debería suponer muchos problemas. El código pudiera quedar de la siguiente manera.

import time
from datetime import datetime

if __name__ == '__main__':
    with open('dates.txt', 'a') as file:

        while True:
            time.sleep(1)
            file.write(str(datetime.now()) + '\n')

En este caso utilizamos el modo a para crear el archivo en caso este no exista y añadir el nuevo contenido al final de este.

pathlib

Otra forma en la cual podemos manipular archivos es mediante el módulo pathlib. Veamos un breve ejemplo.

>>> import pathlib
>>> path = pathlib.Path('ips.txt') 
>>> type(path.read_text())
'str'
>>> path.read_text()
'143.200.119.151\n173.80.163.60\n89.228.175.19\n6.74.140.2...

Para leer el contenido de forma binaria será necesario utilizar el método read_bytes.

Si por el contrario deseamos sobreescribir todo el contenido del archivo, haremos uso del método write_text.

>>> path.write_text('DEMO')
4

Conclusión

Listo, en este post aprendimos dos formas en las cuales podemos manipular archivos, ya sea mediante la función open o el módulo pathlib, del cual estaremos hablando más en profundidad en la siguiente entrega.


¿El contenido te resulto de ayuda?

Para poder dejar tu opinión es necesario ser un usuario autenticado. Login

Más Tips y Ejercicios 🐍

Adquiere una subscripción PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 🔓
Nuevo límite: Incrementa tu límite de ejercicios por semana. 🚀
Contenido único: Recibe semanalmente recursos exclusivos de Python (Videos, Artículos y Capitulos del libro PyWombat, comienza como desarrollador Python. 🐍