- Micropython: Aprendiendo a utilizar el sistema de archivos. Parte 1
- Micropython: Aprendiendo a utilizar el sistema de archivos. Parte 2
En la primera parte de esta serie de artículos vimos que es el sistema de archivos de Micropython y algunos métodos empleados para trabajar con directorios. También trabajamos con archivos para guardar y leer variables de texto. En esta segunda parte nos enfocaremos en los archivos binarios.
En el artículo anterior vimos distintos métodos para trabajar con archivos y los empleamos para guardar datos del tipo cadena de texto, por lo que decimos que son archivos de texto. Este formato de archivos es muy cómodo de usar, porque su contenido se puede ver con facilidad al imprimirlo o pasarlo a una computadora.
Sin embargo el de texto no es un formato eficiente para guardar datos si tenemos poca memoria, ya que se ocupa un byte del archivo por cada carácter. Por ejemplo, en un archivo de texto, para guardar un dato entre “000” y “255” se emplean 3 bytes, mientras que si lo usamos en formato binario, un sólo byte alcanza para guardar la misma información.
Saber utilizar archivos binarios también nos permite abrir y leer archivos de tipos muy variados, como imágenes en distintos formatos para volcar a un display o archivos de sonido para reproducirlos a través de un parlante.
Usando archivos binarios
Micropython nos permite trabajar con archivos binarios, para lo cual debemos usar algunos métodos adicionales.
Para abrir un archivo binario seguiremos empleando el método open, pero esta vez, cuando especifiquemos el modo en que lo abrimos añadiremos el modificador b. Así, si queremos abrir un archivo binario para la lectura escribiremos:
open ("Nombre", "rb")
y si lo queremos abrir para escritura:
open ("Nombre", "wb")
Para escribir y leer datos también utilizaremos los métodos write y read.
Al escribir datos en un archivo binario, Micropython no admite que utilicemos directamente valores numéricos. Por ejemplo, si intentamos escribir el número 156 con write, obtendremos un error:
Micropython espera que usemos una variable que funcione como buffer, que debe ser del tipo bytearray, array o string con los datos para escribir (aunque sea uno solo). Probamos de nuevo usando bytearray:
Se puede apreciar la diferencia en el valor devuelto por el método write. En el ejemplo devolvió 1 porque escribió sólo un byte cuyo valor es 156, mientras que hubiera devuelto 3 si escribíamos “156”.
Si lo que queremos escribir es un valor constante, también lo podemos pasar como un string que represente un número hexadecimal si anteponemos la letra “b”, que indica que se trata de una secuencia de bytes:
En este caso escribimos 3 bytes: x9c, x9b y x9a que representan los numeros decimales 156, 155 y 154.
También los podemos escribir como lista de valores:
Para leer datos usamos también el método read. Si lo usamos sin especificar la cantidad de bytes, lee el archivo entero:
En este ejemplo se guardan 10 bytes y luego se lee el archivo completo (en el código ASCII el caracter 9 corresponde al tabulador horizontal, por eso se lo muestra como “\t”).
Si queremos leer una cantidad de caracteres, debemos especificarlo en el método read. Si indicamos mas de 1, nos devolverá una lista:
Moviéndonos dentro del archivo
Cuando leemos datos desde un archivo, ya sea del tipo de texto o binario, lo hacemos a partir de un determinado valor índice. Este índice se pone a cero cuando abrimos el archivo, indicando el inicio y se va incrementando según la cantidad de caracteres o bytes que vayamos leyendo.
A veces puede que necesitemos ubicar un punto específico dentro de un archivo, ya sea hacia atrás o hacia adelante de la última lectura, por lo que necesitaremos modificar este índice.
Para facilitar estas operaciones, Micropython nos provee de dos métodos:
tell (): Devuelve el valor del índice
seek (offset, origen): Establece un nuevo valor para el índice.
Según el valor de origen es desde donde se toma la referencia:
0, se cuenta desde el inicio del archivo (offset debe ser un valor positivo)
1, se cuenta desde la posición actual (offset puede ser positivo o negativo)
2, se cuenta desde el final del archivo (offset debe ser negativo)
Por ejemplo, siguiendo con el archivo “datos.bin” que contiene los valores del 0 al 9:
Luego de abrir el archivo, la llamada a tell nos devuelve 0, porque el índice está al comienzo del mismo. Luego de leer 3 bytes, otra llamada a tell nos indica que el indice ahora vale 3.
Al poner seek (1,0) volvemos el índice a la posición 1, y al leer leemos el valor “\01”. Luego con seek (-3,2) nos movemos 3 posiciones a partir del final, ubicandonos en la posición 7, lo que queda confirmado cuando al leer dos bytes estos son “\x07” y “\x08”.
Conclusión
Los archivos binarios son una alternativa a los archivos de texto para guardar información y pueden ser mas convenientes en algunas aplicaciones. Los métodos para abrir, escribir y leer en modo binario son los mismos que para el modo texto, con algunas modificaciones. Si queremos movernos dentro de un archivo para buscar información podemos emplear los métodos seek y tell.
Espero que el artículo les sea de utilidad y lo apliquen para sus propios proyectos. Como siempre, cualquier duda o sugerencia pueden dejarla mas abajo en la sección de comentarios.