# Python how to write to a binary file?

## 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("`