I'm trying to use Python to loop over a long binary file filled with 8-byte records.
Each record has the format [ uint16 | uint16 | uint32 ]
(which is "HHI" in struct-formatting)
Apparently each 8-byte block is getting treated as an int, instead of an array of 8-bytes, then causing the struct.unpack call to fail
with open(fname, "rb") as f:
sz=struct.calcsize("HHI")
print(sz) # This shows 8, as expected
for raw in f.read(sz): # Expect this should read 8 bytes into raw
print(type(raw)) # This says raw is an 'int', not a byte-array
record=struct.unpack("HHI", raw ) # "TypeError: a bytes-like object is required, not 'int'"
print(record)
How can I read my file as a series of structures, and print them each out?
解决方案
The iter builtin, if passed a callable and a sentinel value will call the callable repeatedly until the sentinel value is returned.
So you can create a partial function with functools.partial (or use a lambda) and pass it to iter, like this:
with open('foo.bin', 'rb') as f:
chunker = functools.partial(f.read, 8)
for chunk in iter(chunker, b''): # Read 8 byte chunks until empty byte returned
# Do stuff with chunk