Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading binary file and looping over each byte

In Python, how do I read in a binary file and loop over each byte of that file?

like image 1000
Jesse Vogt Avatar asked Jun 23 '09 21:06

Jesse Vogt


People also ask

How do you read bytes in binary?

You can open the file using open() method by passing b parameter to open it in binary mode and read the file bytes. open('filename', "rb") opens the binary file in read mode.

How do I read bytes from a file?

ReadAllBytes(String) is an inbuilt File class method that is used to open a specified or created binary file and then reads the contents of the file into a byte array and then closes the file. Syntax: public static byte[] ReadAllBytes (string path);


1 Answers

Python 2.4 and Earlier

f = open("myfile", "rb") try:     byte = f.read(1)     while byte != "":         # Do stuff with byte.         byte = f.read(1) finally:     f.close() 

Python 2.5-2.7

with open("myfile", "rb") as f:     byte = f.read(1)     while byte != "":         # Do stuff with byte.         byte = f.read(1) 

Note that the with statement is not available in versions of Python below 2.5. To use it in v 2.5 you'll need to import it:

from __future__ import with_statement 

In 2.6 this is not needed.

Python 3

In Python 3, it's a bit different. We will no longer get raw characters from the stream in byte mode but byte objects, thus we need to alter the condition:

with open("myfile", "rb") as f:     byte = f.read(1)     while byte != b"":         # Do stuff with byte.         byte = f.read(1) 

Or as benhoyt says, skip the not equal and take advantage of the fact that b"" evaluates to false. This makes the code compatible between 2.6 and 3.x without any changes. It would also save you from changing the condition if you go from byte mode to text or the reverse.

with open("myfile", "rb") as f:     byte = f.read(1)     while byte:         # Do stuff with byte.         byte = f.read(1) 

python 3.8

From now on thanks to := operator the above code can be written in a shorter way.

with open("myfile", "rb") as f:     while (byte := f.read(1)):         # Do stuff with byte. 
like image 181
Skurmedel Avatar answered Sep 28 '22 10:09

Skurmedel