Tengo una lista de bytes como enteros, que es algo así como
[120, 3, 255, 0, 100]
¿Cómo puedo escribir esta lista en un archivo como binario?
¿Funcionaría esto?
newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
newFile.write(newFileBytes)
TypeError: argument 1 must be string or buffer, not list
.Respuestas:
Esto es exactamente para lo que
bytearray
sirve:Si está usando Python 3.x, puede usarlo
bytes
en su lugar (y probablemente debería hacerlo, ya que indica mejor su intención). Pero en Python 2.x, eso no funcionará, porquebytes
es solo un alias parastr
. Como de costumbre, mostrar con el intérprete interactivo es más fácil que explicar con texto, así que déjame hacer eso.Python 3.x:
Python 2.x:
fuente
str.encode
ystruct.pack
si necesita trabajar en 2.2. Pero 2.6 ha estado fuera por 5 años; los tres Ubuntu LTS todavía están en soporte, las tres versiones de OS X en soporte, la versión principal anterior de CentOS / RHEL, etc., todos vienen con él incorporado. Si necesita soportar 2.5 o 2.1 o 1.6 o lo que sea, probablemente saber ...bytearray
convertidos todavía\n
a\r\n
, por lo que es poco satisfactoria para los datos binarios, si la bandera "b" no se pasa al abrir el archivo.\r\n
función forma parte de las opciones de saltos de línea universales para el texto.)Use
struct.pack
para convertir los valores enteros en bytes binarios, luego escriba los bytes. P.ejSin embargo, nunca le daría una
.txt
extensión a un archivo binario .El beneficio de este método es que también funciona para otros tipos, por ejemplo, si alguno de los valores fuera mayor que 255, podría usar
'5i'
el formato para obtener enteros completos de 32 bits.fuente
Para convertir de enteros <256 a binario, use la
chr
función. Entonces estás buscando hacer lo siguiente.fuente
charmap
más queascii
, y funciona tanto en python2 como en python3. Laascii
codificación solo funciona en python2.A partir de Python 3.2+, también puede lograr esto utilizando el
to_bytes
método int nativo:Es decir, cada llamada a
to_bytes
en este caso crea una cadena de longitud 1, con sus caracteres dispuestos en orden big-endian (que es trivial para cadenas de longitud 1), que representa el valor enterobyte
. También puede acortar las dos últimas líneas en una sola:fuente
Puede usar el siguiente código de ejemplo usando la sintaxis de Python 3:
Aquí hay una línea de shell:
fuente
Use pickle, así: import pickle
Su código se vería así:
Para volver a leer los datos, use el método pickle.load
fuente