Reading binary file in python
python
Solution
`for rec in inh:` reads one line at a time -- not what you want for a binary file. Read 4 bytes at a time (with a `while` loop and `inh.read(4)`) instead (or read everything into memory with a single `.read()` call, then unpack successive 4-byte slices). The second approach is simplest and most practical as long as the amount of data involved isn't huge:
import struct
with open('test.bin', 'rb') as inh:
indata = inh.read()
for i in range(0, len(data), 4):
pos = struct.unpack('i', data[i:i+4])
print(pos)
If you do fear potentially huge amounts of data (which would take more memory than you have available), a simple generator offers an elegant alternative:
import struct
def by4(f):
rec = 'x' # placeholder for the `while`
while rec:
rec = f.read(4)
if rec: yield rec
with open('test.bin', 'rb') as inh:
for rec in by4(inh):
pos = struct.unpack('i', rec)
print(pos)
A key advantage to this second approach is that the `by4` generator can easily be tweaked (while maintaining the specs: return a binary file's data 4 bytes at a time) to use a different implementation strategy for buffering, all the way to the first approach (read everything then parcel it out) which can be seen as "infinite buffering" and coded:
def by4(f):
data = inf.read()
for i in range(0, len(data), 4):
yield data[i:i+4]
while leaving the "application logic" (what to do with that stream of 4-byte chunks) intact and independent of the I/O layer (which gets encapsulated within the generator).
Problem
I wrote a python script to create a binary file of integers. ``` import struct pos = [7623, 3015, 3231, 3829] inh = open('test.bin', 'wb') for e in pos: inh.write(struct.pack('i', e)) inh.close() ``` It worked well, then I tried to read the 'test.bin' file using the below code. ``` import struct inh = open('test.bin', 'rb') for rec in inh: pos = struct.unpack('i', rec) print pos inh.close() ``` But it failed with an error message: ``` Traceback (most recent call last): File "readbinary.py", line 10, in <module> pos = struct.unpack('i', rec) File "/usr/lib/python2.5/struct.py", line 87, in unpack return o.unpack(s) struct.error: unpack requires a string argument of length 4 ``` I would like to know how I can read these file using `struct.unpack`. Many thanks in advance, Vipin