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]))