Eu tenho uma lista de bytes como números inteiros, que é algo como
[120, 3, 255, 0, 100]
Como posso escrever esta lista em um arquivo como binário?
Isso funcionaria?
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
.Respostas:
É exatamente
bytearray
para isso:Se você estiver usando o Python 3.x, poderá usá-lo
bytes
(e provavelmente deveria, pois sinaliza melhor sua intenção). Mas no Python 2.x, isso não funcionará, porquebytes
é apenas um alias parastr
. Como de costume, mostrar com o intérprete interativo é mais fácil do que explicar com texto, então deixe-me fazer isso.Python 3.x:
Python 2.x:
fonte
str.encode
estruct.pack
se precisar trabalhar no 2.2. Mas o 2.6 está fora há 5 anos; todos os três LTSs do Ubuntu ainda suportam, todas as três versões do OS X, a versão principal anterior do CentOS / RHEL, etc., todos vêm com ele embutido. Se você precisar suportar o 2.5 ou 2.1 ou 1.6 ou o que for, provavelmente você sabe ...bytearray
ainda se converte\n
em\r\n
, tornando-o insatisfatório para dados binários, se o sinalizador "b" não for passado ao abrir o arquivo.\r\n
recurso faz parte das opções newlines universais para o texto.)Use
struct.pack
para converter os valores inteiros em bytes binários e, em seguida, escreva os bytes. Por exemploNo entanto, eu nunca daria uma
.txt
extensão a um arquivo binário .O benefício desse método é que ele também funciona para outros tipos, por exemplo, se algum dos valores for maior que 255, você poderá usar
'5i'
o formato para obter números inteiros de 32 bits.fonte
Para converter de números inteiros <256 para binários, use a
chr
função Então você está olhando para fazer o seguinte.fonte
charmap
e nãoascii
, e funciona tanto em python2 quanto em python3. Aascii
codificação funciona apenas em python2.No Python 3.2+, você também pode fazer isso usando o
to_bytes
método int nativo:Ou seja, cada chamada única
to_bytes
nesse caso cria uma sequência de comprimento 1, com seus caracteres organizados em ordem big endian (que é trivial para as sequências de comprimento 1), que representa o valor inteirobyte
. Você também pode reduzir as duas últimas linhas em uma única:fonte
Você pode usar o seguinte exemplo de código usando a sintaxe do Python 3:
Aqui está o shell one-liner:
fonte
Use pickle, assim: import pickle
Seu código ficaria assim:
Para ler os dados novamente, use o método pickle.load
fonte