During your career as a Pythonista, you will most likely find yourself required to work with binary data. See the examples outlined below to efficiently read/write to a Binary file.
Preparation
- The
NumPy
library supports multi-dimensional arrays and matrices in addition to a collection of mathematical functions.
To install this library, navigate to an IDE terminal. At the command prompt ($
), execute the code below. For the terminal used in this example, the command prompt is a dollar sign ($
). Your terminal prompt may be different.
$ pip install numpy
Hit the <Enter>
key on the keyboard to start the installation process.
If the installation was successful, a message displays in the terminal indicating the same.
Feel free to view the PyCharm installation guide for the required library.
Add the following code to the top of each code snippet. This snippet will allow the code in this article to run error-free.
import numpy as np import struct from array import array
π‘ Note: The struct
and array
libraries do not need installation as they come with Python.
Read a Binary File to an Array
For this example, a list of integers is saved to the binary file finxter-01.bin
.
fp = open("finxter-01.bin", "wb") nums = [12, 42, 45, 78, 96] array = bytearray(nums) fp.write(array) fp.close()
- Line [1] shows a new file created in
wb
(write binary) mode. A file pointer is assigned to reference this file. - Line [2] contains a list of integers assigned to the variable
nums
. - Line [3] creates a bytearray of the variable
nums
and assigns this value to the variablearray
. Thebytearray()
method returns a bytearray object which is an array of bytes. - Line [4] writes the variable
array
to the file opened earlier. - Line [5] closes the previously opened file.
Reading From a Binary File
Reading from a binary file is similar to the steps taken above.
fp = open("finxter-01.bin", "rb") nums = list(fp.read()) print(nums) fp.close()
- Line [1] opens the
finxter-01.bin
file inrb
(read binary) mode. A file pointer is assigned to reference the file. - Line [2] reads in the list of integers from the file created above. The contents are saved to
nums
. - Line [3] sends the output to the terminal.
- Line [4] closes the previously opened file.
Output
[12, 42, 45, 78, 96] |
Read a Binary File into a String
For this example, this code writes a sentence to the finxter-02.bin
file.
fp = open("finxter-02.bin", "wb") fp.write(b"The journey of a thousand miles begins with a single step.") fp.close()
- Line [1] opens a new binary file in
wb
(write binary) mode. A file pointer (fp
) is assigned to reference this file. - On line [2], the string is written to the file. Notice the
b
character at the start of the string. Theb
character denotes binary. - Line [3] closes the previously opened file.
The contents of this file are read back in.
fp = open("finxter-02.bin", "rb") string = fp.read() print(string) fp.close()
- Line [1] opens the
finxter-02.bin
binary file inrb
(read binary) mode. A file pointer (fp
) is assigned to reference this file. - Line [2] reads in the file and saves it to a variable named
string
. - Line [3] outputs the variable
string
to the terminal. - Line [4] closes the previously opened file.
Output
b’The journey of a thousand miles begins with a single step.’ |
Read in a Binary File and Write to Another Binary File
For this example, this code reads in the contents of finxter-02.bin
and writes said contents to finxter-03.bin
.
fp_from = open("finxter-02.bin", "rb") string = fp_from.read() fp_to = open("finxter-03.bin", "wb") fp_to.write(string) fp_from.close() fp_to.close()
- Line [1] opens an existing binary file in
rb
(read binary) mode. A file pointer (fp_from
) is assigned to reference this file. - Line [2] reads in the file and saves it to a variable named
string
. - Line [3] opens a new binary file in
wb
(write binary) mode. Another file pointer (fp_to
) is assigned to reference this file. - Line [4] writes the contents of the variable
string
to the new filefinxter-03.bin
. - Lines [5-6] close the open files.
Read in a Binary File until EOF
For this example, we will be opening an existing binary file, finxter-03.bin
. This file contains a few rows of binary data. This code uses a while loop to move through the file until the EOF marker has been reached.
with open("finxter-03.bin", "rb") as fp: while True: data = fp.read(10) if not data: break print(data)
- Line [1] opens the file slightly differently from other examples. By using Python’s
with open
method, a file pointer is still assigned. However, theclose()
method is not required. Theopen with
code automatically closes the file after the code has stopped. - Line [2] starts the while loop.
- Line [3] reads in the data using the file pointer (
fp
) 10 characters/bytes at a time. - Line [4] checks to see if the EOF marker is reached.
- If the EOF marker is reached, line [5] runs, and the code stops (
break
).
- If the EOF marker is reached, line [5] runs, and the code stops (
- Otherwise, the code moves to line [6] and outputs ten characters/bytes of data to the terminal.
- Line [3] reads in the data using the file pointer (
Output
b’\x0c\x00\x00\x00-\x00\x00\x00K\x00′ b’\x00\x00b\x00\x00\x00′ |
Read a Binary File into a NumPy Array
This example uses Python’s famous NumPy library. The NumPy library makes working with arrays a breeze. NumPy also has functions for working in the domain of linear algebra, Fourier transform, and matrices. The wonderful thing about NumPy is that the code executes up to 50 times faster than Python’s traditional lists.
my_list = [10, 15, 20, 25, 30, 35, 40] my_array = np.array(my_list).tofile("finxter-04.bin") print(np.fromfile("finter-04.bin", dtype=np.int32))
- Line [1] creates a list of integers and assigns it to a variable named
my_list
. - Line [2] uses the
np.array()
method and saves the array to a file. - Line [3] outputs the contents to the terminal.
Output
[10 15 20 25 30 35 40] |
π‘ Note: You will get different results based on the dtype
entered. The choices are int8, int32, or int64.
Read a Binary File Byte by Byte
From time to time, a binary file will need to be read byte by byte.
fp = open("finxter-04.bin", "rb") byte = fp.read(1) while byte: print(byte) byte = fp.read(1) fp.close()
- Line [1] opens an existing binary file in rb (read binary) mode. A file pointer (
fp
) is assigned to reference this file. - Line [2] reads in one (1) byte from the file is read in and saved to a variable named
byte
. - LIne [3] instantiates a while loop that will continue until there are no more bytes to read in.
- Line [4] outputs the byte to the terminal.
- Line [5] reads in another byte.
- Line [6] closes the previously opened file.
Output (snippet)
b’\n’ b’\x00′ b’\x00′ b’\x00′ b’\x0f’ … |
Read a Binary File in Chunks
The best practice for reading in large files is to read in small portions (chunks).
For this example, an image of a dog (dog.jpg
) is placed in the current working directory before running the code.
chunk_size = 20 image_file = "dog.jpg" with open(image_file, "rb") as infile: while True: chunk = infile.read(chunk_size) if not chunk: break print(chunk)
- Line [1] assigns the size of the chunk to the variable
chunk_size
. - Line [2] assigns the variable
image_file
to the file to be read in. - Line [3] opens the
image_file
. - Line [4] instantiates the while loop and executes
while True
.- Line [5] reads in a chunk of the open file for each loop.
- Line [6] checks if the variable chunk contains data; if no data is found, Line [7] executes.
- Line [8] outputs the chunk to the terminal.
- Line [5] reads in a chunk of the open file for each loop.
Output (snippet)
b’\xbb\xad\xd6\x8c\xed\xd6\xb5# \x7fV;\x9f\x08\xcf\xfb\x15\xae\xb5\xed’ b’bIr\x15g\xb7\xf6\x8a\x05\x15\x01\x9d\xd6c\x0e\xfd@\xfe\x95\x9f’ b’9\xff\x00g\xe45\xff\x00sN:\xfd4\x8c\x90<L\xe5\xdal’ b’u\x8c\x19\xc1\xe4^\xd5\xaa&\xd6\x03OS\x7f\xf5\x97\xd1K[p’ … |
Read in a Binary File to ASCII
To convert the contents of a binary file to ASCII, you will need to use the encode()
method. This method returns an encoded version of the string. In this case, it would be ascii
.
fp = open("finxter-05.bin", "wb") string = bytearray("Python is cool!".encode("ascii")) fp.write(string) fp.close()
- Line [1] creates and opens a file in
wb
(write binary) mode and assigns a file pointer (fp
). - Line [2] assigns the variable string the encoded bytearray string
"Python is cool!"
. - Line [3] writes the contents of the string to the file.
- Line [4] closes the previously open file.
fp = open("finxter-05.bin", "rb") print(fp.read()) fp.close()
- Line [1] shown below opens the file created above in
rb
(read binary) mode. - Line [2] displays the output to the console.
- Line [3] closes the previously open file.
Output
b’Python is cool!’ |
Read a Binary File using Little Endian
Four integers are saved to a new binary file in “little-endian” format for this example. The file is then read back in and will display these integers.
with open("finxter-06.bin", "wb") as fp: fp.write(struct.pack("<4i", 12, 45, 75, 98))
- Line [1] creates a new binary file named
finxter-06.bin
in wb (write binary) mode and assigns a file pointer (fp
)- Line [2] saves four integers to a file using the
struct.pack()
method. This method requires two parameters:- The first parameter (“<4i”) indicates 4 integers saved in “little-endian” format.
- The second parameter contains the integers to be saved.
- Line [2] saves four integers to a file using the
The code below reads in the data saved earlier to an array.
arr = array("i") with open("finxter-06.bin", "rb") as fp: arr.fromfile(fp, 4) print(arr) array('i', [12, 45, 75, 98])
- Line [1] assigns the variable
arr
to an array of integers (as denoted by the:i
). - Line [2] opens the file created above in
rb
(read binary) mode, and a file pointer (fp
) is assigned to reference this file.- Line [3] reads in the array from the file (the four integers saved above).
- Line [4] outputs the data to the terminal.
- Line [5] is the output from this code.
Output
array(‘i’, [12, 45, 75, 98])b’Python is cool!’ |
Feel free to join our free email academy with cheat sheets, Python, freelancing, and lots of fun! π