python读二进制文件遍历,如何在Python中分批循环二进制文件

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值