Python R2


Leer Archivos Binarios en Python


En la entrada anterior vimos como abrir y manejarnos con archivos de texto. Pero como hago para leer archivos binarios. Bien para este propósito necesitaremos usar el modulo struct. Y la estructura binaria del archivo que queremos leer.

Bien a modo de ejemplo yo pondré un programita en C que genere un archivo binario simple y luego un script python que levante este archivo y lo imprima en pantalla.

Programita en C  es muy simple, solo genera el archivito.

#include <stdio.h>

struct rec
{
 int x;
 char y;
 int z;
};

int main()
{
    char i;
    FILE *f;
    struct rec r;
    f=fopen("prueba.bin","wb");
    if (!f) return 1;
    for (i=1;i<=20; i++)
    {
         r.x = i;
         r.y = i;
         r.z = i + 1;
         fwrite(&r,sizeof(struct rec),1,f);
         printf ("(%i,%i,%i)\n",r.x,r.y,r.z);
    }
    fclose(f);
    printf("Peso de la estructura rec %i\n", sizeof(struct rec));
    return 0;
}

En mi caso el compilador C que usa como minimo una palabra de 32 bit (4 bytes) para la escritura, por eso cada registro rec pesa 12 bytes. 4 del primer int 1 del char , otros 4 del segundo int y 3 mas que usa para completar el char.

El ejemplo en python se puede ver en readBin.py

#!/usr/bin/python
# Nombre de Fichero : readBin.py
import struct

f = file('prueba.bin','r')
i=1
f.seek(0,2) #vamos al final del archivo
fin = f.tell()
f.seek(0,0) #vamos al principio del archivo

while (f.tell() < fin):
    s = f.read(12)
    dato = str(struct.unpack("i b i", s)) # desempaquetamos
    print i ," ->",dato
    i+=1;

Mascara de struct

Lo que sigue es una traducción de print struct.__doc__

Como opción podemos indicar en el  formato  de la mascara, el primer char byte que indica el orden, el tamaño y la alineación:

@: native order, tamaño y la alineación (default)
=: native order, std. tamaño y la alineación
<: little-endian, std. tamaño y la alineación
>: big-endian, std. tamaño y la alineación
!: es igual que  >

Los demás caracteres indican los tipos de los  datos atómicos del registro que utilizaremos y debe coincidir exactamente.

x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;
h:short; H:unsigned short; i:int; I:unsigned int;
l:long; L:unsigned long; f:float; d:double.

Casos especiales (decimal contar anterior indica la longitud):
s: cadena (array de char); p: cadena de pascal.

Un caso especial (sólo disponible en formato nativo):
P: Un tipo que es lo suficientemente amplia como para celebrar un puntero.

Un caso especial (no en modo nativo a menos que ‘long long’ en la plataforma C):
q: largo tiempo; Q: unsigned long long

El espacio en blanco entre los formatos se ignora.
La variable struct.error es una excepción planteada por los errores.

Anuncios

2 comentarios to 'Leer Archivos Binarios en Python'

Subscribe to comments with RSS o TrackBack to 'Leer Archivos Binarios en Python'.


  1. Excelente artículo, añadiré tu blog a mis blog amigos

  2. will said,

    hola
    muchas gracias, por este post, muy bueno.

    pero me ustaria saber como puedo editarle una cadena de bits o numeros de la cabecera, y ponerle los numeros que yo quiera (para proteger el archivo), y posteriormente dejarlo igual cuando los necesite.

    gracias


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: