Discussion:
[CRySoL] Leer fichero binario en Python
unknown
2007-11-22 08:52:05 UTC
Permalink
Hola a todos/as

Escribo porque tengo la necesidad de leer un fichero en Python de forma
binaria, es decir, que quiero recuperar los datos de byte en byte y
almacenarlos en el equivalente en C al tipo unsigned byte , cargando
valores numéricos entre 0 y 255 únicamente.

El problema es que, hasta donde yo se, Python solo deja leer ficheros
como si fueran de texto, y todo lo que devuelve la función "read" son
cadenas. Puedo leer cadenas de un solo carácter con "read(1)", pero
recupero valores en hexadecimal que, si Python puede, representa en
formate cadena y no en formato numérico, no pudiendo convertirlos a
número con nada que se me ocurra.

¿Alguna idea de como se puede hacer esto? Seguro que es trivial, pero
no se como se hace
unknown
2007-11-22 08:57:57 UTC
Permalink
Acabo de encontrar algo que me vale para el caso que necesito. Hay un
módulo en Python llamado "struct" que tiene una función llamada
"unpack" que acepta dos argumentos, uno el tipo al que convertir y otro
el carácter que quieres convertir.

Así, si hago:

import struct

struct.unpack('B', 'a')

obtengo (97,), del que puedo extraer el 97 que no se si será realmente
el valor binario de la letra a... ya lo comprobaré

El Thu, 22 Nov 2007 09:52:05 +0100
Post by unknown
Hola a todos/as
Escribo porque tengo la necesidad de leer un fichero en Python de
forma binaria, es decir, que quiero recuperar los datos de byte en
byte y almacenarlos en el equivalente en C al tipo unsigned byte ,
cargando valores numéricos entre 0 y 255 únicamente.
El problema es que, hasta donde yo se, Python solo deja leer ficheros
como si fueran de texto, y todo lo que devuelve la función "read" son
cadenas. Puedo leer cadenas de un solo carácter con "read(1)", pero
recupero valores en hexadecimal que, si Python puede, representa en
formate cadena y no en formato numérico, no pudiendo convertirlos a
número con nada que se me ocurra.
¿Alguna idea de como se puede hacer esto? Seguro que es trivial, pero
no se como se hace
unknown
2007-11-22 09:08:36 UTC
Permalink
Hola,

Creo que lo que buscas es lo siguiente:

# Read.
newWork = array.array('B', open(work).read()).tolist()

# Write.
array.array('B', model).tofile(open(path, 'w'))

Habla por sí solo.

Un saludo,
David.
Post by unknown
Hola a todos/as
Escribo porque tengo la necesidad de leer un fichero en Python de forma
binaria, es decir, que quiero recuperar los datos de byte en byte y
almacenarlos en el equivalente en C al tipo unsigned byte , cargando
valores numéricos entre 0 y 255 únicamente.
El problema es que, hasta donde yo se, Python solo deja leer ficheros
como si fueran de texto, y todo lo que devuelve la función "read" son
cadenas. Puedo leer cadenas de un solo carácter con "read(1)", pero
recupero valores en hexadecimal que, si Python puede, representa en
formate cadena y no en formato numérico, no pudiendo convertirlos a
número con nada que se me ocurra.
¿Alguna idea de como se puede hacer esto? Seguro que es trivial, pero
no se como se hace
_______________________________________________
CRySoL mailing list
http://crysol.inf-cr.uclm.es/
https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol
unknown
2007-11-22 10:08:53 UTC
Permalink
Mucho más limpio y fácil, ¡muchas gracias!

El Thu, 22 Nov 2007 10:08:36 +0100
Post by unknown
Hola,
# Read.
newWork = array.array('B', open(work).read()).tolist()
# Write.
array.array('B', model).tofile(open(path, 'w'))
Habla por sí solo.
Un saludo,
David.
unknown
2007-11-22 12:27:32 UTC
Permalink
Aprovecho para decir que si alguien tiene las mismas inquietudes que
Lucas pero con el lenguaje C, esta página es bastante buena:

http://www.conclase.net/c/librerias/funcion.php?fun=fopen

Saludos.


******************************************
"Cuando el sonido de la música late contra la tarima el jazz se
convierte en el corazón del tiempo", Lucia Etxebarría

UniversiJazz
http://www.eldiadeciudadreal.es/noticia.php/4897
Post by unknown
Mucho más limpio y fácil, ¡muchas gracias!
El Thu, 22 Nov 2007 10:08:36 +0100
Post by unknown
Hola,
# Read.
newWork = array.array('B', open(work).read()).tolist()
# Write.
array.array('B', model).tofile(open(path, 'w'))
Habla por sí solo.
Un saludo,
David.
_______________________________________________
CRySoL mailing list
http://crysol.inf-cr.uclm.es/
https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol
unknown
2007-11-22 14:40:53 UTC
Permalink
Pues ya de paso en C++:

http://www.cplusplus.com/doc/tutorial/files.html

-----Mensaje original-----
De: crysol-bounces at arco.inf-cr.uclm.es en nombre de Manuel David Jiménez Patiño
Enviado el: jue 22/11/2007 13:27
Para: crysol at arco.inf-cr.uclm.es
Asunto: Re: [CRySoL] Leer fichero binario en Python

Aprovecho para decir que si alguien tiene las mismas inquietudes que
Lucas pero con el lenguaje C, esta página es bastante buena:

http://www.conclase.net/c/librerias/funcion.php?fun=fopen

Saludos.


******************************************
"Cuando el sonido de la música late contra la tarima el jazz se
convierte en el corazón del tiempo", Lucia Etxebarría

UniversiJazz
http://www.eldiadeciudadreal.es/noticia.php/4897
Post by unknown
Mucho más limpio y fácil, ¡muchas gracias!
El Thu, 22 Nov 2007 10:08:36 +0100
Post by unknown
Hola,
# Read.
newWork = array.array('B', open(work).read()).tolist()
# Write.
array.array('B', model).tofile(open(path, 'w'))
Habla por sí solo.
Un saludo,
David.
_______________________________________________
CRySoL mailing list
http://crysol.inf-cr.uclm.es/
https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol
_______________________________________________
CRySoL mailing list
http://crysol.inf-cr.uclm.es/
https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol


-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://arco.inf-cr.uclm.es/pipermail/crysol/attachments/20071122/3dabe243/attachment.htm
unknown
2007-11-27 11:05:00 UTC
Permalink
¿Y por qué no así?:

fd = open ("ficherito", "rb")

for line in fd:
for character in line:
tratar ( hex ( ord ( character ) ) )

fd.close()

A mí me parece más fácil que lo que habéis dicho... A lo mejor no te
vale, pero creo que es la manera más sencilla :-D



El Thu, 22 Nov 2007 11:08:53 +0100
Post by unknown
Mucho más limpio y fácil, ¡muchas gracias!
El Thu, 22 Nov 2007 10:08:36 +0100
Post by unknown
Hola,
# Read.
newWork = array.array('B', open(work).read()).tolist()
# Write.
array.array('B', model).tofile(open(path, 'w'))
Habla por sí solo.
Un saludo,
David.
_______________________________________________
CRySoL mailing list
http://crysol.inf-cr.uclm.es/
https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol
--
In a world without walls and fences, who needs Windows and Gates?
unknown
2007-11-27 11:21:51 UTC
Permalink
Se ve bastante cómoda, pero la verdad es que la forma usando array me
viene bien, ya que necesito almacenar todos los valores en una lista
como enteros comprendidos entre 0 y 255.

De todos modos gracias por la aportación, supongo que lo que quería
hacer (ya está hecho) se podría haber resuelto usando ese "mode" para
abrir los ficheros.

El Tue, 27 Nov 2007 12:05:00 +0100
Post by unknown
fd = open ("ficherito", "rb")
tratar ( hex ( ord ( character ) ) )
fd.close()
A mí me parece más fácil que lo que habéis dicho... A lo mejor no te
vale, pero creo que es la manera más sencilla :-D
unknown
2007-11-27 15:38:15 UTC
Permalink
Te insultaría gravemente si esto no fuera una lista de correo... ¡¡¡y
yo implementando eso mismo de Modint a lo casero!!! Que mala es la
falta de comunicación, jajaja.

No voy a modificarlo ya porque no es plan, pero bueno es saberlo. De
todos modos no creo que me ahorrara esa clase mucho trabajo, ya que la
clase para matrices que he usado en Python (numpy.mat) pasa todos los
valores a un tipo float propio que se llama numpy.float64 ... así que
la inversa, producto modular y todo eso tendría que hacermelos de todos
modos.

De todas formas gracias ;)

El Tue, 27 Nov 2007 16:15:48 +0100
bytes = []
f = open(path,"rb")
value = f.read(1)
bytes.append(Modint(value,mod))
value = f.read(1)
f.close()
return bytes
Modint es una clase de enteros congruentes módulo n. Creamos una clase
para hacer las operaciones aritméticas con este tipo de números y no
volvernos locos :-)
Un saludo!
unknown
2007-11-28 15:11:32 UTC
Permalink
Tampoco es tan costoso, y es mucho más legible, imho

for line in fd:
for character in line:
array[pos] = ord ( character )
pos = pos + 1
Post by unknown
Se ve bastante cómoda, pero la verdad es que la forma usando array me
viene bien, ya que necesito almacenar todos los valores en una lista
como enteros comprendidos entre 0 y 255.
De todos modos gracias por la aportación, supongo que lo que quería
hacer (ya está hecho) se podría haber resuelto usando ese "mode" para
abrir los ficheros.
El Tue, 27 Nov 2007 12:05:00 +0100
Post by unknown
fd = open ("ficherito", "rb")
tratar ( hex ( ord ( character ) ) )
fd.close()
A mí me parece más fácil que lo que habéis dicho... A lo mejor no te
vale, pero creo que es la manera más sencilla :-D
_______________________________________________
CRySoL mailing list
http://crysol.inf-cr.uclm.es/
https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: https://arco.inf-cr.uclm.es/pipermail/crysol/attachments/20071128/9a928581/attachment.htm
unknown
2007-11-28 15:13:46 UTC
Permalink
Aunque ahora que lo veo, habría que añadir los retornos de carro a mano, en
cada iteración line. No sé si es la mejor forma de hacerlo, rectifico y me
quedo con otra ... :)
Post by unknown
Tampoco es tan costoso, y es mucho más legible, imho
array[pos] = ord ( character )
pos = pos + 1
Post by unknown
Se ve bastante cómoda, pero la verdad es que la forma usando array me
viene bien, ya que necesito almacenar todos los valores en una lista
como enteros comprendidos entre 0 y 255.
De todos modos gracias por la aportación, supongo que lo que quería
hacer (ya está hecho) se podría haber resuelto usando ese "mode" para
abrir los ficheros.
El Tue, 27 Nov 2007 12:05:00 +0100
Post by unknown
fd = open ("ficherito", "rb")
tratar ( hex ( ord ( character ) ) )
fd.close()
A mí me parece más fácil que lo que habéis dicho... A lo mejor no te
vale, pero creo que es la manera más sencilla :-D
_______________________________________________
CRySoL mailing list
http://crysol.inf-cr.uclm.es/
https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: https://arco.inf-cr.uclm.es/pipermail/crysol/attachments/20071128/e8a6d821/attachment.htm
unknown
2007-11-30 16:12:22 UTC
Permalink
Hola:

¿Tratar carácter a carácter? Recorre un ficherillo de unas cuantas
megas, primero así y luego con array, y mide lo que tarda. Puede ser
entre 500 y 2000 veces más lento que con el array...

Es cierto que es una solución sencilla, pero es leeeeenta...

Salduos



El Tue, 27 Nov 2007 12:05:00 +0100
Post by unknown
fd = open ("ficherito", "rb")
tratar ( hex ( ord ( character ) ) )
fd.close()
A mí me parece más fácil que lo que habéis dicho... A lo mejor no te
vale, pero creo que es la manera más sencilla :-D
El Thu, 22 Nov 2007 11:08:53 +0100
Post by unknown
Mucho más limpio y fácil, ¡muchas gracias!
El Thu, 22 Nov 2007 10:08:36 +0100
Post by unknown
Hola,
# Read.
newWork = array.array('B', open(work).read()).tolist()
# Write.
array.array('B', model).tofile(open(path, 'w'))
Habla por sí solo.
Un saludo,
David.
_______________________________________________
CRySoL mailing list
http://crysol.inf-cr.uclm.es/
https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol
--
¿Usuario de Linux? ¿Qué eres? ¿un driver?

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : https://arco.inf-cr.uclm.es/pipermail/crysol/attachments/20071130/b89a68a5/attachment.pgp
Loading...