Page 358

5.3 Ficheros binarios

Ficheros binarios en Python Python tambi´en permite trabajar con ficheros binarios. La apertura, lectura/escritura y cierre de ficheros se efect´ ua con las funciones y m´etodos de Python que ya conoces: open, read , write y close. Con read puedes leer un n´ umero cualquiera de caracteres (de bytes) en una cadena. Por ejemplo, f.read (4) lee 4 bytes del fichero f (previamente abierto con open). Si esos 4 bytes corresponden a un entero (en binario), la cadena contiene 4 caracteres que lo codifican (aunque no de forma que los podamos visualizar c´ omodamente). ¿C´ omo asignamos a una variable el valor entero codificado en esa cadena? Python proporciona un m´ odulo con funciones que permiten pasar de binario a ((tipos Python)) y viceversa: el m´ odulo struct. Su funci´ on unpack ((desempaqueta)) informaci´ on binaria de una cadena. Para ((desempaquetar)) un entero de una cadena almacenada en una variable llamada enbinario la llamamos as´ı: unpack ("i", enbinario). El primer par´ ametro desempe˜ na la misma funci´ on que las cadenas de formato en scanf , s´ olo que usa un juego de marcas de formato diferentes (i para el equivalente a un int, d para float, q para long long, etc.. Consulta el manual del m´ odulo struct para conocerlos.). Aqu´ı tienes un ejemplo de uso: un programa que lee y muestra los valores de un fichero binario de enteros: 1 2 3 4 5 6 7 8

from struct import unpack f = open("primeros.dat", "r") while 1: c = f.read (4) if c == ’’: break v = unpack ("i", c) print v[0] f.close()

F´ıjate en que el valor devuelto por unpack no es directamente el entero, sino una lista (en realidad una tupla), por lo que es necesario indexarla para acceder al valor que nos interesa. La raz´ on de que devuelva una lista es que unpack puede desempaquetar varios valores a la vez. Por ejemplo, unpack ("iid", cadena) desempaqueta dos enteros y un flotante de cadena (que debe tener al menos 16 bytes, claro est´ a). Puedes asignar los valores devueltos a tres variables as´ı: a, b, c = unpack ("iid", cadena). Hemos aprendido, pues, a leer ficheros binarios con Python. ¿C´ omo los escribimos? Siguiendo un proceso inverso: empaquetando primero nuestros ((valores Python)) en cadenas que los codifican en binario mediante la funci´ on pack y escribiendolas con el m´etodo write. Este programa de ejemplo escribe un fichero binario con los n´ umeros del 0 al 99: 1 2 3 4 5 6

from struct import pack f = open("primeros.dat", "w") for v in range(100): c = pack ("i", v) f.write(c) f.close()

S´ olo queda que aprendas a implementar acceso directo a los ficheros binarios con Python. Tienes disponibles los modos de apertura ’r+’, ’w+’ y ’a+’. Adem´ as, el m´etodo seek permite desplazarse a un byte cualquiera del fichero y el m´etodo tell indica en qu´e posici´ on del fichero nos encontramos.

4 5 6 7 8 9

int main(void) { FILE * fp; char palabra[MAXLON+1]; int tam;

10 11 12 13

/* primero, averiguar el tama˜ no del fichero (en palabras) */ fp = fopen("diccio.dat", "rb"); tam = fseek (fp, 0, SEEK_END) / MAXLON ;

14 15

352

/* y ya podemos listarlas en orden inverso */ Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement