Question or problem about Python programming:
I have a list of bytes as integers, which is something like
[120, 3, 255, 0, 100]
How can I write this list to a file as binary?
Would this work?
newFileBytes = [123, 3, 255, 0, 100] # make file newFile = open("filename.txt", "wb") # write to file newFile.write(newFileBytes)
How to solve the problem:
Solution 1:
This is exactly what bytearray
is for:
newFileByteArray = bytearray(newFileBytes) newFile.write(newFileByteArray)
If you’re using Python 3.x, you can use bytes
instead (and probably ought to, as it signals your intention better). But in Python 2.x, that won’t work, because bytes
is just an alias for str
. As usual, showing with the interactive interpreter is easier than explaining with text, so let me just do that.
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]'
Solution 2:
Use struct.pack
to convert the integer values into binary bytes, then write the bytes. E.g.
newFile.write(struct.pack('5B', *newFileBytes))
However I would never give a binary file a .txt
extension.
The benefit of this method is that it works for other types as well, for example if any of the values were greater than 255 you could use '5i'
for the format instead to get full 32-bit integers.
Solution 3:
To convert from integers < 256 to binary, use the chr
function. So you’re looking at doing the following.
newFileBytes=[123,3,255,0,100] newfile=open(path,'wb') newfile.write((''.join(chr(i) for i in newFileBytes)).encode('charmap'))
Solution 4:
As of Python 3.2+, you can also accomplish this using the to_bytes
native int method:
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'))
I.e., each single call to to_bytes
in this case creates a string of length 1, with its characters arranged in big-endian order (which is trivial for length-1 strings), which represents the integer value byte
. You can also shorten the last two lines into a single one:
newFile.write(''.join([byte.to_bytes(1, byteorder='big') for byte in newFileBytes]))
Solution 5:
You can use the following code example using Python 3 syntax:
from struct import pack with open("foo.bin", "wb") as file: file.write(pack("
Here is shell one-liner:
python -c $'from struct import pack\nwith open("foo.bin", "wb") as file: file.write(pack("