Reading and interpreting data from a binary file in Python
Try using the bytearray
type (Python 2.6 and later), it's much better suited to dealing with byte data. Your try
block would be just:
ba = bytearray(fh.read())for byte in ba: print byte & 1
or to create a list of results:
low_bit_list = [byte & 1 for byte in bytearray(fh.read())]
This works because when you index a bytearray
you just get back an integer (0-255), whereas if you just read a byte from the file you get back a single character string and so need to use ord
to convert it to an integer.
If your file is too big to comfortably hold in memory (though I'm guessing it isn't) then an mmap
could be used to create the bytearray
from a buffer:
import mmapm = mmap.mmap(fh.fileno(), 0, access=mmap.ACCESS_READ)ba = bytearray(m)
One way:
import arrayfilebytes= array.array('B')filebytes.fromfile(open("/tmp/test.txt", "rb"))if all(i & 1 for i in filebytes): # all file bytes are odd
Another way:
fobj= open("/tmp/test.txt", "rb")try: import functoolsexcept ImportError: bytereader= lambda: fobj.read(1)else: bytereader= functools.partial(fobj.read, 1)if all(ord(byte) & 1 for byte in iter(bytereader, '')): # all bytes are oddfobj.close()