【发布时间】:2020-11-22 20:13:43
【问题描述】:
我需要循环读取 64KB 的块并对其进行处理,但在文件末尾减去 16 个字节时停止:最后 16 个字节是tag 元数据。
文件可能超级大,所以我无法在 RAM 中全部读取。
我找到的所有解决方案都有些笨拙和/或不符合标准。
with open('myfile', 'rb') as f:
while True:
block = f.read(65536)
if not block:
break
process_block(block)
如果16 <= len(block) < 65536,这很简单:这是有史以来的最后一个区块。所以useful_data = block[:-16] 和tag = block[-16:]
如果len(block) == 65536,它可能意味着三件事:整个块是有用的数据。或者说这个 64KB 块实际上是最后一个块,所以useful_data = block[:-16] 和tag = block[-16:]。或者这个 64KB 块后面跟着另一个只有几个字节(比如说 3 个字节)的块,所以在这种情况下:useful_data = block[:-13] 和 tag = block[-13:] + last_block[:3]。
如何以比区分所有这些情况更好的方式处理这个问题?
注意:
-
该解决方案应该适用于使用
open(...)打开的文件,也适用于io.BytesIO()对象或远程SFTP 打开的文件(使用pysftp)。 -
我正在考虑获取文件对象的大小,用
f.seek(0,2) length = f.tell() f.seek(0)然后在每个之后
block = f.read(65536)我们可以通过
length - f.tell()知道我们是否还远未结束,但同样,完整的解决方案看起来不是很优雅。
【问题讨论】:
标签: python buffer block chunks file-read