python读取文件最后几行_使用Python获取文件的最后n行,类似于tail

小编典典

这可能比你的要快。不假设行长。一次返回一个文件块,直到找到正确数量的'\ n'字符为止。

def tail( f, lines=20 ):

total_lines_wanted = lines

BLOCK_SIZE = 1024

f.seek(0, 2)

block_end_byte = f.tell()

lines_to_go = total_lines_wanted

block_number = -1

blocks = [] # blocks of size BLOCK_SIZE, in reverse order starting

# from the end of the file

while lines_to_go > 0 and block_end_byte > 0:

if (block_end_byte - BLOCK_SIZE > 0):

# read the last block we haven't yet read

f.seek(block_number*BLOCK_SIZE, 2)

blocks.append(f.read(BLOCK_SIZE))

else:

# file too small, start from begining

f.seek(0,0)

# only read what was not read

blocks.append(f.read(block_end_byte))

lines_found = blocks[-1].count('\n')

lines_to_go -= lines_found

block_end_byte -= BLOCK_SIZE

block_number -= 1

all_read_text = ''.join(reversed(blocks))

return '\n'.join(all_read_text.splitlines()[-total_lines_wanted:])

我不喜欢关于行长的棘手假设,实际上,你永远都不知道那样的事情。

通常,这将在循环的第一遍或第二遍中定位最后20行。如果你的74个字符实际上是准确的,则将块大小设置为2048,并且几乎立即尾随20行。

另外,我不会消耗大量的大脑卡路里来尝试与物理OS块进行精确对齐。使用这些高级I / O程序包,我怀疑你会发现尝试在OS块边界上对齐会对性能产生任何影响。如果使用较低级别的I / O,则可能会看到加速。

2020-02-14

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值