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 ответов:
это точно
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]))