Python как записать в двоичный файл?


у меня есть список байтов в целых чисел, что-то вроде

[120, 3, 255, 0, 100]

Как я могу написать этот список в файл в двоичном виде?

будет ли это работать?

newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
newFile.write(newFileBytes)
6 76

6 ответов:

это точно bytearray для:

newFileByteArray = bytearray(newFileBytes)
newFile.write(newFileByteArray)

если вы используете Python 3.X, вы можете использовать bytes вместо этого (и, вероятно, должен, так как это лучше сигнализирует о вашем намерении). Но в Python 2.х, это не сработает, потому что bytes - это просто псевдоним для str. Как обычно, показывать с помощью интерактивного интерпретатора проще, чем объяснять с помощью текста, поэтому позвольте мне просто сделать это.

Python 3.x:

>>> bytearray(newFileBytes)
bytearray(b'{\x03\xff\x00d')
>>> bytes(newFileBytes)
b'{\x03\xff\x00d'

Python 2.x:

>>> bytearray(newFileBytes)
bytearray(b'{\x03\xff\x00d')
>>> bytes(newFileBytes)
'[123, 3, 255, 0, 100]'

использовать struct.pack чтобы преобразовать целочисленные значения в двоичные байты, затем запишите байты. Е. Г.

newFile.write(struct.pack('5B', *newFileBytes))

однако я бы никогда не дал двоичный файл a

чтобы преобразовать из целых чисел . Итак, вы смотрите на то, чтобы сделать следующее.

newFileBytes=[123,3,255,0,100]
newfile=open(path,'wb')
newfile.write((''.join(chr(i) for i in newFileBytes)).encode('ascii'))

Вы можете использовать следующий пример кода, используя синтаксис языка Python 3:

from struct import pack
with open("foo.bin", "wb") as file:
  file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))

вот оболочка однострочная:

python -c $'from struct import pack\nwith open("foo.bin", "wb") as file: file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))'

начиная с Python 3.2+, вы также можете выполнить это с помощью to_bytes родной метод int:

newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
for byte in newFileBytes:
    newFile.write(byte.to_bytes(1, byteorder='big'))

то есть, каждый отдельный вызов to_bytes в этом случае создается строка длины 1, с ее символами, расположенными в порядке большого конца (что тривиально для строк длины 1), которая представляет собой целое значение byte. Вы также можете сократить последние две строки в одну:

newFile.write(''.join([byte.to_bytes(1, byteorder='big') for byte in newFileBytes]))

использовать рассол, как это: импорт рассольник

ваш код будет выглядеть так:

import pickle
mybytes = [120, 3, 255, 0, 100]
with open("bytesfile", "wb") as mypicklefile:
    pickle.dump(mybytes, mypicklefile)

чтобы прочитать данные обратно, используйте рассол.метод загрузки