[Python-es] Escritura en archivos binarios

751 views
Skip to first unread message

Pixu Kideak

unread,
Jan 27, 2016, 9:41:03 AM1/27/16
to La lista de python en castellano
Buenos días,

Estoy trabajando con ficheros binarios pero tengo una duda.

Lo primero que hago en mi programa es buscar un valor en el fichero, a partir de esa posición  muevo el puntero X posiciones y me interesaria escribir cierto valor binario y/o HEX en esa posición.

He intentado con:

ficheroLeer = '/ruta/mi/fichero.bin'
archivo = open(ficheroLeer,'r+b')
...
archivo.seek(1) #Esta es la posición en la que me interesa modificar el contenido.
archivo.write(21) #Digamos que quiero escribir ! - que HEX es 21 - en esa dirección.

Pero no consigo escribirlo puesto que parece que write recibe sólo variables de tipo str.

¿Cómo podría escribir HEX21 en el fichero?

Un saludo y gracias por vuestra ayuda ;-)

Juan Ignacio

unread,
Jan 27, 2016, 10:00:49 AM1/27/16
to La lista de python en castellano
yo intentaría leer el fichero en memoria, cambiaría alli los datos y luego volvería a escribir el fichero. Los discos no pueden escribir "un byte".

_______________________________________________
Python-es mailing list
Pyth...@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/




--
Juan Ignacio Rodríguez de León
Móvil: 605 890514
E-Mail: euri...@gmail.com
http://www.elornitorrincoenmascarado.com/
http://descon2.com/

Pixu Kideak

unread,
Jan 27, 2016, 10:12:08 AM1/27/16
to La lista de python en castellano
"
yo intentaría leer el fichero en memoria, cambiaría alli los datos y luego volvería a escribir el fichero. Los discos no pueden escribir "un byte".

"
Cuando se esta realizando la asignación archivo = open(ficheroLeer, 'r+b') ¿no se estaría trabajando contra el objeto "archivo" qué está en memoria?
O por el contrario, ¿te refieres a volcar todo el contenido del fichero en una lista y trabajar contra ésta; una vez finalizado volcar de nuevo el contenido de la lista al fichero?

Un saludo y gracias,

Chema Cortes

unread,
Jan 27, 2016, 10:21:27 AM1/27/16
to La lista de python en castellano


El mié., 27 ene. 2016 16:12, Pixu Kideak <pixuk...@gmail.com> escribió:
"
yo intentaría leer el fichero en memoria, cambiaría alli los datos y luego volvería a escribir el fichero. Los discos no pueden escribir "un byte".

"
Cuando se esta realizando la asignación archivo = open(ficheroLeer, 'r+b') ¿no se estaría trabajando contra el objeto "archivo" qué está en memoria?
O por el contrario, ¿te refieres a volcar todo el contenido del fichero en una lista y trabajar contra ésta; una vez finalizado volcar de nuevo el contenido de la lista al fichero?

No hace falta bajar tanto de nivel. Lo más seguro es que Python sobrescriba el fichero completo en disco, pero eso no debe preocuparte. 

Lo que si es importante es saber si usas python3. Los ficheros binarios usan el tipo bytes y, por lo que dices, no lo estas usando. 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog

Jaime Perea

unread,
Jan 27, 2016, 10:28:25 AM1/27/16
to pyth...@python.org

Yo lo he tenido que hacer usando el módulo struct, se empaquetan las variables dependiendo del tipo que tengan y entonces se escriben.

 

Por ejemplo para dos numeros reales y dos enteros

 

txt = struct.pack('2d2i',float1,float2,int1,inte2)

archivo.write(txt)

 

--

Jaime Perea

Pixu Kideak

unread,
Jan 27, 2016, 10:29:42 AM1/27/16
to La lista de python en castellano
Estoy con la versión Python 3.5.0

Daπid

unread,
Jan 27, 2016, 11:06:06 AM1/27/16
to La lista de python en castellano

2016-01-27 15:40 GMT+01:00 Pixu Kideak <pixuk...@gmail.com>:
>
> archivo.seek(1) #Esta es la posición en la que me interesa modificar el contenido.
> archivo.write(21) #Digamos que quiero escribir ! - que HEX es 21 - en esa dirección.
>
> Pero no consigo escribirlo puesto que parece que write recibe sólo variables de tipo str.


¿Es esto?

archivo.write(hex(21))

hex(21) devuelve '0x15'


> Cuando se esta realizando la asignación archivo = open(ficheroLeer, 'r+b') ¿no se estaría trabajando contra el objeto "archivo" qué está en memoria?

No. Acabo de modificar un caracter de un archivo de 24 GB. El proceso ha sido casi instantáneo, sin un consumo de RAM o IO apreciable, y prácticamente instantáneo. Ignoro qué optimizaciones específicas el sistema de archivos puede estar haciendo, pero desde luego, no está leyéndolo todo.


/David.

Chema Cortes

unread,
Jan 27, 2016, 11:28:48 AM1/27/16
to La lista de python en castellano
El mié., 27 ene. 2016 a las 16:29, Pixu Kideak (<pixuk...@gmail.com>) escribió:
Estoy con la versión Python 3.5.0

with open(ficheroLeer, 'r+b') as f:
    f.seek(1)
    f.write(bytes([21])

Según lo que sea, también podrías usar "literarles":

with open(ficheroLeer, 'r+b') as f:
    f.seek(1)
    f.write(b'\x15')


 

Chema Cortes

unread,
Jan 27, 2016, 11:36:05 AM1/27/16
to La lista de python en castellano
El mié., 27 ene. 2016 a las 17:28, Chema Cortes (<pyc...@gmail.com>) escribió:
El mié., 27 ene. 2016 a las 16:29, Pixu Kideak (<pixuk...@gmail.com>) escribió:
Estoy con la versión Python 3.5.0

with open(ficheroLeer, 'r+b') as f:
    f.seek(1)
    f.write(bytes([21])

Según lo que sea, también podrías usar "literarles":

with open(ficheroLeer, 'r+b') as f:
    f.seek(1)
    f.write(b'\x15')

Creo que he tomado mal los valores hexadecimales de la pregunta original. Para escribir un '!' en un fichero binario se usaría directamente b'!'


with open(ficheroLeer, 'r+b') as f:
    f.seek(1)
    f.write(b'!')

Pixu Kideak

unread,
Jan 27, 2016, 12:50:08 PM1/27/16
to La lista de python en castellano
Muchas gracias,

Al final lo pude solucionar de las siguiente manera:

...
import binascii
...
archivo.seek(posicion)
valor = binascii.a2b_hex('21')  #Almacena el valor HEX en una variable para escribirla
archivo.write(valor)
...

Un saludo y gracias por vuestra colaboración ;-)

Pixu Kideak

unread,
Jan 27, 2016, 3:05:49 PM1/27/16
to La lista de python en castellano
Buenas tardes,

Tras ver cómo se puede modificar el contenido de una posición concreta en un fichero que abro en modo binario tengo una duda con un experimento que deseo realizar.

Tengo un fichero que he abierto con un editor HEX, tengo "fichados" unas cadenas -sé su valor en ASCII y HEX gracias al editor - .

Lo que quiero hacer es, buscar la cadena en el fichero (así podría conseguir la dirección de inicio de la cadena). A partir de dónde empieza la cadena sumarle una cantidad y poder posicionar el puntero en la posición deseada para cambiar su contenido.

Una vez la idea esta clara, la duda que tengo es:

¿El fichero sólo se puede abrir de 1 modo? Suponiendo que sólo se podría abrir en modo binario para poder realizar la modificación a nivel de byte, ¿Cómo se podría realizar la búsqueda de la cadena para obtener la dirección? ¿A la hora de buscar un patrón éste debería estar en HEX no?

No sé si lo estoy enfocando correctamente y/o me estoy complicando ¬_¬"

Un saludo y gracias,



Cristian Moyano

unread,
Jan 30, 2016, 2:39:49 PM1/30/16
to La lista de python en castellano
Muy buenas tardes a todos aprovecho este correo también por la siguiente duda,  estoy tratando (y digo tratando por que estoy recién comenzando en la programación  ya que vengo del lado networking) de hacer algo similar a lo que señala pixu, mas que nada quiero en un archivo encontrar palabras, seleccionar la linea que se encuentra esta palabra y escribirlas en un archivo en formato CSV, algún código de ejemplo para realizar eso?


Saludos 
Reply all
Reply to author
Forward
0 new messages