我正在寻找文件的前Nmb。这是一个基本的实现:
def get_first_n_mb(self, file=None, n=5):
"""
Will return the first 5 (or N) MB of the passed file
"""
file = file or self.file
with open(file, 'rb') as fp:
file_data = self.file_first_n_mb = fp.read(1e6 * n)
return file_data
但是,用户可能会传递较大的数字,例如n = 1000,在这种情况下,我们希望对读取进行分块。做块的合适“大小”是什么,还是上述方法仍然有效?该如何改善?
答案 0 :(得分:1)
read()
允许返回的金额少于您要求的金额。您应该循环调用它,直到达到请求的数量或EOF。您需要根据上次阅读的大小来减少阅读量。
def get_first_n_mb(self, file=None, n=5):
file = file or self.file
amt = 1e6 * n
file_data = ''
with open(file, 'rb') as fp:
while amt > 0:
try:
block = fp.read(amt)
file_data += block
amt -= len(block)
except EOFError:
break
return file_data
对于普通文件,read()
通常会返回您所请求的内容,只要文件那么长。但是其他类型的流通常返回的较少(例如,从终端读取数据通常仅返回一行)。