Python escribiendo binario

Uso python 3 Intenté escribir binario en un archivo. Utilizo r + b.

for bit in binary: fileout.write(bit) 

donde binario es una lista que contiene números. ¿Cómo escribo esto para archivar en binario?

El archivo final debe verse como b ‘x07 \ x08 \ x07 \

Gracias

Cuando abre un archivo en modo binario, esencialmente está trabajando con el tipo de bytes . Así que cuando escribes en el archivo, necesitas pasar un objeto de bytes , y cuando lees, obtienes un objeto de bytes . Por el contrario, al abrir el archivo en modo de texto, está trabajando con objetos str .

Entonces, escribir “binario” es realmente escribir una cadena de bytes:

 with open(fileName, 'br+') as f: f.write(b'\x07\x08\x07') 

Si tiene enteros reales que desea escribir como binarios, puede usar la función de bytes para convertir una secuencia de enteros en un objeto de bytes:

 >>> lst = [7, 8, 7] >>> bytes(lst) b'\x07\x08\x07' 

Combinando esto, puede escribir una secuencia de enteros como un objeto de bytes en un archivo abierto en modo binario.


Como señaló Hyperboreus en los comentarios, los bytes solo aceptarán una secuencia de números que realmente caben en un byte, es decir, números entre 0 y 255. Si desea almacenar enteros arbitrarios (positivos) de la forma en que están, sin tener que molestar acerca de saber su tamaño exacto (que se requiere para la estructura), entonces puede escribir fácilmente una función auxiliar que divide esos números en bytes separados:

 def splitNumber (num): lst = [] while num > 0: lst.append(num & 0xFF) num >>= 8 return lst[::-1] bytes(splitNumber(12345678901234567890)) # b'\xabT\xa9\x8c\xeb\x1f\n\xd2' 

Entonces, si tiene una lista de números, puede iterarlos fácilmente y escribirlos en el archivo; Si desea extraer los números individualmente más tarde, probablemente desee agregar algo que haga un seguimiento de qué bytes individuales pertenecen a qué números.

 with open(fileName, 'br+') as f: for number in numbers: f.write(bytes(splitNumber(number))) 

donde binario es una lista que contiene números

Un número puede tener mil y una representaciones binarias diferentes (endianess, ancho, 1-complemento, 2-complemento, flotadores de diferente precisión, etc.). Entonces, primero tiene que decidir en qué representación desea almacenar sus números. Luego puedes usar el módulo de estructura para hacerlo.

Por ejemplo, la secuencia de bytes 0x3480 se puede interpretar como 32820 (short sin signo little endian), o -32716 (short con signo little-endian) o 13440 (short big-endian).

Pequeño ejemplo:

 #! /usr/bin/python3 import struct binary = [1234, 5678, -9012, -3456] with open('out.bin', 'wb') as f: for b in binary: f.write(struct.pack('h', b)) #or whatever format you need with open('out.bin', 'rb') as f: content = f.read() for b in content: print(b) print(struct.unpack('hhhh', content)) #same format as above 

huellas dactilares

 210 4 46 22 204 220 128 242 (1234, 5678, -9012, -3456)