[pyar] leer archivo binario

252 views
Skip to first unread message

Leandro De Lorenzi

unread,
Mar 8, 2011, 8:57:05 AM3/8/11
to Python Argentina
Buenas.

Tengo un problema: Necesito leer un fichero cualquiera en formato binario.
Pero binario en unos y ceros, no el binario en símbolos, como se logra con open("fichero","rb"),

Probé tambien con la función struct, pero devuelve tuplas, y para cada tipo de dato necesito especificar el formato, lo cual es muy complicado.
Además no tengo idea de como revertirlo, cosa que tambien necesito.

Alguien tiene idea de como hacerlo?

Es decir, necesito una función leer.binario() que me devuelva puros unos y ceros o decimales o hexa o lo que sea, pero en números.

Gracias

--
         (__)
         (oo)
   /------\/
  / |    ||  
 *  /\---/\
    ~~   ~~  
...."Have you mooed today?"...

Facundo Batista

unread,
Mar 8, 2011, 9:22:40 AM3/8/11
to Python Argentina
2011/3/8 Leandro De Lorenzi <lelede...@gmail.com>:

> Tengo un problema: Necesito leer un fichero cualquiera en formato binario.
> Pero binario en unos y ceros, no el binario en símbolos, como se logra con
> open("fichero","rb"),

Más allá que hay como una confusión con respecto a lo que estás
leyendo o mostrando (vaya uno a saber qué significa "binario en
símbolos"), podés hacer esto para leer un archivo y tener los valores
en 0s y 1s:

Grabamos algo en un archivo de prueba:

>>> f = open('test.txt', 'w')
>>> f.write('123')
>>> f.close()

Leemos y pasamos a bin:

>>> f = open('test.txt')
>>> ''.join(string.zfill(bin(ord(x))[2:],8) for x in f.read())
'001100010011001000110011'

Grabé a propósito '123' para que veas la diferencia entre leer números
y texto: el '1', por ejemplo, no tiene el valor binario '00000001',
sino '00110001', o sea 49, el valor ascii del caracter '1'.

Slds.

--
.    Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
_______________________________________________
pyar mailing list py...@python.org.ar
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

Martin Cerdeira

unread,
Mar 8, 2011, 12:25:06 PM3/8/11
to Python Argentina
2011/3/8 Facundo Batista <facundo...@gmail.com>:

> (vaya uno a saber qué significa "binario en
> símbolos"),

Se refiere a lo que 'ves' cuando abris un binario raw:

>>> f = open('Host.exe','rb')
>>> for i in f:
.... print i

�M��J �NDQ��E��B
[��]� � h @����U���� hv @d�Pd�%��t SVW�e��E�
@3��}��}��� V�P �}��}܉}ĉ}��}��}��}��}��}��}��}��}��}��}��}���x�����h�����X�����H�����8�����(����� �������������������������������������������f9=r�Aj � � @f9���fdž���Wj

�VDR�E�P� � @�� P� � @���NHQj � D @�Ӄ� � ���3�;����f���M�� , @f����jj

�FDP�M�Q� � @�� P� � @3�9FP����f���M�� , @f���j�~P�FHPj �� ���; ���� f�f������3��E�f;����� �VHR�E�P� � @�M���� f�9 �� �]�+Y ;Y r � l @�M��~P+����+y ;y r� l @�M��A �� ��� �k �=� @��P�M�Q� � @�Ӌ�� ������PV�R


-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
()  ascii ribbon campaign
/\  www.asciiribbon.org

Rodolfo Hugo González

unread,
Mar 8, 2011, 1:07:17 PM3/8/11
to py...@python.org.ar
El 08/03/11 14:25, Martin Cerdeira escribió:

> 2011/3/8 Facundo Batista <facundo...@gmail.com>:
>> (vaya uno a saber qué significa "binario en
>> símbolos"),
>
> Se refiere a lo que 'ves' cuando abris un binario raw:
>
>>>> f = open('Host.exe','rb')
>>>> for i in f:
> .... print i
>
> �M��J �NDQ��E��B
> [��]� � h @����U���� hv @d�Pd�%��t SVW�e��E�
> @3��}��}��� V�P �}��}܉}ĉ}��}��}��}��}��}��}��}��}��}��}��}���x�����h�����X�����H�����8�����(����� �������������������������������������������f9=r�Aj � � @f9���fdž���Wj
>
> �VDR�E�P� � @�� P� � @���NHQj � D @�Ӄ� � ���3�;����f���M�� , @f����jj
>
> �FDP�M�Q� � @�� P� � @3�9FP����f���M�� , @f���j�~P�FHPj �� ���; ���� f�f������3��E�f;����� �VHR�E�P� � @�M���� f�9 �� �]�+Y ;Y r � l @�M��~P+����+y ;y r� l @�M��A �� ��� �k �=� @��P�M�Q� � @�Ӌ�� ������PV�R
>
>
Hola Martín...
Estaba siguiendo el hilo, y no te entendía muy bien.
Puede ser que lo que vos querés es que en vez de ver esos caracteres
raros, como por ejemplo este " ", veas su correspondiente interpretación
de su número ascii en binario , por ej. "10101010" ?
(El número binario que puse es aleatorio, no corresponde a ese caracter...)

Saludos
Rolfo

signature.asc

Martin Cerdeira

unread,
Mar 8, 2011, 1:32:09 PM3/8/11
to Python Argentina
2011/3/8 Rodolfo Hugo González <lu8...@gmail.com>:
> _______________________________________________
> pyar mailing list py...@python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>

El hilo no lo empecé yo, simplemente, hice una interpretación de lo
que el usuario original pudo haber querido decir cuando dijo "binario
en simbolos"

Saludos

Oscar Gunsett

unread,
Mar 8, 2011, 3:33:18 PM3/8/11
to Python Argentina
Modifique un programa ya propuesto para que cumpla con el mail de inicio del hilo:



>>> f = open('Host.exe','rb')
>>> for i in f:
  ....     print bin(i)

solo falta saber que la función devuelve un binario de un entero en formato string agregandole como prefijo el 0b, ejemplo:

>>> bin(34)
'0b100010'
>>>

ahora te queda sacar el 0b y formatear en 8 bits la presentación, lo cual es una pavada.

Facundo Batista

unread,
Mar 8, 2011, 3:35:41 PM3/8/11
to Python Argentina
2011/3/8 Oscar Gunsett <ogun...@gmail.com>:

> solo falta saber que la función devuelve un binario de un entero en formato
> string agregandole como prefijo el 0b, ejemplo:
>
>>>> bin(34)
> '0b100010'
>>>>
>
> ahora te queda sacar el 0b y formatear en 8 bits la presentación, lo cual es
> una pavada.

No sólo es una pavada, sino que le mostré cómo hacerlo en la primer
respuesta en este hilo...

Teniendo eso en cuenta, ¿cual es el objetivo de este mail?

Slds.

--
.    Facundo

Leandro De Lorenzi

unread,
Mar 8, 2011, 5:37:28 PM3/8/11
to Python Argentina
> ahora te queda sacar el 0b y formatear en 8 bits la presentación, lo cual es
> una pavada.

sip, ya ta.

 
No sólo es una pavada, sino que le mostré cómo hacerlo en la primer
respuesta en este hilo...

Teniendo eso en cuenta, ¿cual es el objetivo de este mail?

 Ni idea.

La idea original era lo que dijo el amigo Martin Cerdeira mas arriba: ver el binario en unos y ceros y no la salida directa de la lectura "raw".
Reply all
Reply to author
Forward
0 new messages