Trabajando con archivos en Python 3: Métodos del objeto file

En esta entrada me gustaría que comenzaramos a trabajar con archivos en python, vamos a aprender a crear y editar archivos desde nuestro código de manera segura usando también try /except para que en caso de obtener errores podamos manejarlos como se debe. Venga manos a la obra! 

Para crear un archivo desde nuestro código encontraras diferentes maneras pero yo recomiendo utilizar la que aquí voy a explicar debido a que es más segura y óptima a la hora de trabajar con archivos.

Creando archivos

La cláusula With

Esta cláusula establece automáticamente un contexto para la ejecución segura debido a que crea un punto de partida de configuraciones iniciales y al finalizar recupera los valores anteriores. Y en el caso de la apertura de un archivo este automáticamente ha de cerrarlo una vez terminada la función que lo involucre, así como también se realiza una limpieza de la memoria utilizada.

Por esto creo que la forma correcta de manipular archivos es utilizando la cláusula with aunque veo muchos tutoriales y cursos donde se enseña a abrir y crear ficheros solo utilizando el método open (lo que no está mal pero tampoco es lo mas optimo)

De esta manera se utiliza un gestor de contexto “Context Manager” que son objetos que tienen definido los métodos __enter__ y __exit__  para inicializar el contexto y para terminarlo al igual que los objetos file, esto nos asegura que se ha de cerrar correctamente.

 

El objeto file (Archivo)

Podemos manipular una variable como un objeto file (archivo) asignándole un archivo mediante la función integrada open e indicando la ruta del archivo seguido del modo en el cual vamos a abrirlo. Entonces la variable toma como valor el archivo y se convierte en un objeto file permitiéndonos trabajar con ella utilizando los métodos.

Entiendes Mendez?

Combinándolo con la cláusula with as lo hacemos de la siguiente manera:

 

Te recomiendo acostumbrarte a hacerlo utilizando la cláusula with as aunque su sintaxis es un poco más difícil de recordar a mi forma de verla es mucho más segura y estable. Venga veamos y repasemos la sintaxis:

 

Bueno si ya has comprendido la sintaxis ponla en práctica.. Intenta crear un archivo “.py” que sea capaz de parir un “txt” (nose porque utilizo estos términos supongo que para generar polémica) Y sino miralo en funcionamiento en mis clásicos gifs:

Dando a luz un .txt (imagen gif)

Abrir spoiler para ver GIF

Métodos del objeto file

Anteriormente habíamos visto que son los métodos, los que se podría traducir como órdenes que le podemos dar a los objetos. Hace poco había visto un ejemplo en un sitio que decía que un objeto podría ser nuestro perro y un método las órdenes que le dictamos las cuales le hemos enseñado con anterioridad (sentarse, rodar, dar la pata). Pero este ejemplo podría traernos a los de proteccion animal por llamar objeto a nuestra mascota, salvo que tuviéramos un perro robot.

Aunque si te habrá servido para recordar vagamente que son los métodos. Veamos nuevamente la definición que dimos anteriormente:

Un método puede ser una serie de sentencias para llevar a cabo una acción, pero en este caso podemos ver al método como el pedido a un objeto para que realice una tarea o en este caso un cambio!

Comprender los métodos del objeto file nos van a permitir trabajar con archivos, (crearlos, abrirlos, guardarlos o solo leerlos)

Es importante saber que cuando abrimos un archivo existe un puntero, que es donde se posiciona el intérprete sobre el archivo, normalmente lo hace al inicio, pero si quisiéramos abrir un archivo con el puntero en determinada ubicación podríamos hacerlo con los métodos de los que dispone el objeto file:

Seek(byte)

Este método se corresponde al puntero que te mencionaba y junto al método tell() nos permitirá ubicarnos al final o al principio de los archivos. Pero el método seek() fue diseñado para archivos binarios, no para archivos de texto.

Este método moverá el puntero hacia el byte indicado como argumento.

seek (desplazamiento, desde_donde)

Si colocamos un cero ‘0’ como argumento a seek nos posiciona al inicio del archivo!

Tell()

El método tell() devuelve el puntero a una posición en un momento dado. Junto con seek() nos permitirán posicionarnos al principio o al final del archivo.

Tell() nos devuelve un entero que indica la posición del puntero.

Read([bytes])

El método read nos permite leer un archivo completo, salvo que indiquemos los bytes entonces solo leerá hasta los bytes determinados. Vamos a ver como utilizarlo abriendo un archivo .txt que tengo por aquí guardado perteneciente a la letra de una canción:

Resultado:

 

 

Presta atención a la letra “r” que colocamos como modo luego del nombre del archivo, esto significa que abre el archivo solo para ser leído. Por ende no puede ser editado.

Y cuidado con esto porque si colocas una “w” de “Write” lo abrirás en modo escribir en el. Y se borrara todo el contenido del archivo. Esto lo veremos más abajo en los Modos de apertura de archivos.

 

Readline([bytes])

El método readline lee una línea del archivo por vez. Si colocamos un solo readline nos leerá una sola línea y si no especificamos a partir de donde sera la primera por defecto. Veamos el código!

Resultado:

Método readline()

Cada vez que hagamos un readline() tomará la siguiente línea.

SPOILER PARA AVANZADO

Algo adicional para la comprensión avanzada en caso de querer imprimir líneas en específico del archivo como por ejemplo el estribillo :

En caso de querer imprimir una linea especifica no podemos hacerlo con readline() correctamente. Aun posicionando el puntero con el método seek() porque el mismo fue creado con la idea de posicionarlo en archivos binarios, y en cambio los archivos de texto se manejan linea a linea, por lo que sería un bodrio calcular donde específicamente establecer el puntero si no es al principio o al final del archivo de texto.

Suponiendo que quisiéramos imprimir a partir de la línea 34 a la 38 inclusive correspondiente al estribillo deberíamos hacerlo iterando el archivo de texto con la función predefinida enumerate e imprimir solo las lineas que nos interesan. Voy a dejar el codigo pero si estas aprendiendo python aun es obvio que no lo comprendas, pero se me ocurre que le puede ser útil a alguien dado que no se encuentran casi formas de iterar correctamente un archivo de texto linea a linea:

Es la única manera que encontré de realizar lo antes mencionado, a esto se le denomina técnica de iteración utilizando la función enumerate(). Que veremos más adelante para no irnos por las ramas, pero joder que tenia que ponerlo porque me volví loco intentando imprimir una línea específica con readlines() y seek() y nunca lo logre.

Readlines()

Lee todas las líneas del archivo en forma de lista separando las líneas con el carácter de escape para los saltos de línea “/n”

Resultado:

Write()

El método write sirve para escribir una cadena dentro del archivo que abrimos. Para esto debemos abrir el archivo en modo de re-escribir lo cual se hace agregando “r+” en el modo de apertura. De esta manera nuestra cadena se añadirá al final.

Resultado:

El código (OPCIONAL) en sí es difícil de comprender a simple vista pero una vez que veas y entiendas todos los métodos te sera mas facil de entender. Pero en si lo que hace es almacenar mediante el método tell() el puntero al final del archivo y lo almacena en una variable entonces luego solo llamamos al método seek() con la variable como argumento para posicionarnos al final luego de agregar la nueva línea, y almacenamos en una variable la línea editada utilizando otro read() y para finalizar imprimimos el nuevo contenido. Pero es opcional solo para que nos quede más chulo.

Tú simplemente puedes hacerlo así:

Si no utilizas el f.read() la línea se añadirá al principio del archivo y no al final. También para agregarla al final puedes abrir el archivo en modo de apertura “a” en vez de “r+” y sin incluir el .read(). Así:

 

Writelines(secuencia)

El método writelines() nos permite escribir una secuencia (elemento iterable) dentro del archivo linea a linea por ejemplo: Una lista.

Resultado:

Sin incluir el código opcional de mostrar las líneas editadas:

Close()

El método close se encarga de cerrar el archivo de forma segura. Si pretendes trabajar con un archivo luego de utilizar el método close() se producirá un error, debido a que ya se cerró. Deberás abrirlo nuevamente.

Modos de apertura de archivos

El modo de apertura de nuestros archivos es importante debido a que determinan varios factores a tener en cuenta y permiten abrir archivos tanto para solo lectura como para edición, o reemplazo completo. Veamos cuales son y cual es su sintaxis a la hora de especificarlo.

Modo de Solo lectura (Read) (“r”)

Para especificar que abrimos un archivo en modo de lectura lo hacemos añadiendo la letra “r” luego del nombre del archivo a abrir. Como lo especifica su nombre solo permite al intérprete trabajar con el archivo en modo lectura por lo que lo cargará en memoria pero no podrá editarlo.

Modo de Escritura (Write) (“w”)

Al abrir un archivo en este modo el mismo sera borrado y vuelto a escribir, por eso es importante distinguir este modo como de truncado. Si el archivo no existe, lo creeara. Pero hay que tener en cuenta el echo de que si el mismo existe sera reescrito, y eso si trabajamos con algun archivo importante es destacable.

Modo de Solo escritura al final (“a”)

Este modo nos permite escribir en el archivo posicionandonos al final de el mismo. Si abrimos un archivo utilizando este modo siempre estaremos escribiendo a continuación de lo que ya se encuentra en el mismo sin necesidad de posicionar el puntero. También al igual que write si el archivo no existe sera creado.

Modo de Lectura- Escritura (+) (r+ , w+, a+)

Si a cualquiera de los anteriores le añadimos un “+” se convierte en modo de escritura y lectura. Pero ambos (“r+”) y (“w+”) trabajan de manera diferente. Al utilizar (“w+”) si el archivo existe será truncado, es decir, se borrara todo su contenido y se sobreescribirá en el. No es así el caso de (“r+”). (a+) permanece igual, solo que al agregarle un + si el fichero no existe sera creado.

Recuerda que tanto “w” como “w+” van a truncar los archivos en caso de existir, por lo que si abres un archivo existente el mismo será sobreescrito y perderás lo que en el se encuentre.

Sintaxis de los modos de apertura:

 

Creando un programa para leer archivos

 

Utilizando Try / Except para atrapar excepciones al abrir archivos

Podemos agregar una sentencia try / except para en caso de generarse una error a la hora de abrir un archivo, por ejemplo en el caso que nos hallamos equivocado de ubicación. Veamos como aplicarlo en este caso de querer abrir un archivo para leerlo:

 

En este caso he eliminado el archivo de texto piratas.txt y por ende nos produce este error (obviamente porque lo estamos intentando abrir en modo “r+” porque si lo intentáramos colocando el modo write (“w+”) el archivo se crearía y no nos daría ningún error):

Traceback (most recent call last):
File “archivo.py”, line 8, in <module>
with open (“pirata.txt”, “r+”) as f: #Abrimos el archivo en modo Reescribir (r+)
FileNotFoundError: [Errno 2] No such file or directory: ‘pirata.txt’

 

Como podemos interpretar en el error nos esta diciendo que el archivo no existe. Así que podemos hacer dos cosas, crear un try / except donde se le advierta al usuario, y también podemos pedirle al usuario que ingrese la ubicación donde debería estar el archivo, que en este caso lo coloque dentro de la carpeta test. ¿Que te parece si lo intentamos? ya tenemos los conocimientos necesarios, venga!

 

Le preguntamos al usuario donde se encuentra el archivo:

 

Para hacer esto es obvio que deberíamos declarar una variable que almacene la ruta del archivo por defecto : /piratas.txt y en caso de error que le solicite al usuario ingresar un nuevo dato en esa variable, podemos hacerlo así:

 

Bien hasta aquí creamos un bucle infinito utilizando while true y ademas añadimos un try/except en caso de que ocurra un error, que sabemos que va a ocurrir porque la ruta que estamos dándole al abrir el archivo no es la correcta!!

Pero si probamos agregar el archivo pirata.txt a donde se encuentra el .py si lo abre, por ende el código esta funcionando bien y es correcto.

Ahora vamos a colocar una variable como nombre de archivo, a la cual llamaremos dirarchivo y seguidamente vamos a colocar en el except un input para que el usuario se vea forzado a dar la ubicación de dicho archivo quedando nuestro código así:

Resultado en Gif:

Programa que abre archivos según ubicación

Espero que te halla encantado como a mi lo bien que funciona!! ^^

 

Algunas ideas a tener en cuenta a la hora de trabajar con archivos

Aprender a trabajar correctamente con archivos nos abre muchas posibilidades, no solo el hecho de crear un texto a mi forma de verlo podemos trabajar con archivos del sistema y programas modificando configuraciones. También podemos crear un código que nos cree y edite otros “.py”. O nos permite reescribir archivos masivamente. Suponiendo que tengas muchos archivos  y quieras agregarle algún copyright o marca personal. Puede permitirte también trabajar con un txt lleno de contraseñas, emails, información útil. Que tu imaginación no te detenga sólo en los cutres .txt y en lo llano sobre lo que aprendes, intenta experimentar con el código.

Adiooos!Esto es todo mi querido lector, me despido cordialmente esperando que te halla gustado esta entrada y por sobre todo te haya ayudado a comprender este maravilloso lenguaje! Un cordial abrazo y nos vemos en la siguiente entrada!! Gracias por visitar mi blog!