Python3 反向按行读取大文件、日志read_reverse_bigfile

适用场景:

反向读取大文件的需求,多半出于想要获取超大的日志文件最后几百行内容,小文件直接通过 lins = file.readlines()[-200:] 就可以直接得出了,

大文件readlines() 会将文件内容全部读取到内存,在GB大小情况下,内存不一定够,列表切片性能差。 生成器反向读取方式更合适。

反向读取大文件,主要基于:<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Read large files in reverse, mainly based on:</font>*</details>
  • file对象的seek()函数,偏移文件指针
  • re 模块finditer 搜寻文件行尾符,Match对象的end获取行尾符索引位置
  • yield 生成器 节省内存

性能验证:

在windows10, RAM 16G,处理器 11th Gen Intel(R) Core(TM) i5-11400 @ 2.60GHz 2.59 GHz , python 3.7.11 下简单验证,

import re
def read_reverse_bigfile(filepath, encoding='utf-8', separator=b'\n', single_size=1024 * 1024):    """    :param filepath: 文件路径    :param encoding: 字符编码,默认utf-8    :param separator: 行尾分隔符,默认 '\n'    :param single_size: 单次读取 字符量,默认 1024*1024    :return: generator     """    with open(filepath, 'rb') as f:        try:            f.seek(0, 2)            position = f.tell()            if position > single_size:                f.seek(-single_size, 2)            else:                f.seek(0, 0)        except OSError as e:            return 'Blank file'        line = b''        while 1:            chunk = f.read(single_size)            index_list = [match.end() for match in re.finditer(separator, chunk)]            index = None            while index_list:                target = index_list.pop()                if index is None:                    line = chunk[target:] + line                else:                    line = chunk[target:index] + line                if line:                    yield line.decode(encoding=encoding)                line = b''                index = target            else:                line = chunk[:index] + line            position = f.tell()            if position > 2 * single_size and single_size > 0:                f.seek(-2 * single_size, 1)            else:                f.seek(0, 0)                single_size = position - single_size                if single_size                     yield line.decode(encoding=encoding)                    return 'End'

undefined

if __name__ == '__main__':    import time    import os    import psutil    pid = os.getpid()    p = psutil.Process(pid)
start_time = time.time()    fp = r'./test30.txt'    rrb = list(read_reverse_bigfile(fp))    print(len(rrb))    print(f'耗时0:{time.time() - start_time}')    with open(fp, encoding='utf-8') as f:        orl = f.readlines()        print(len(orl))    print(f'耗时1:{time.time() - start_time}')    info = p.memory_full_info().uss/(1024*1024)    print(f'内存信息:{info}MB')

undefined

Original: https://www.cnblogs.com/yougnen/p/16081877.html
Author: 阿伦来啦
Title: Python3 反向按行读取大文件、日志read_reverse_bigfile

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/500156/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • DataFrame增加和删除行

    先说结论: dataframe增加行可以用df.append合并两个dataframe实现 dataframe删除行可以用df.drop实现 一、DataFrame增加行 已知da…

    Python 2023年8月6日
    041
  • CTFSHOW 常用姿势篇(801-810)

    CTFSHOW 常用姿势篇 群主在视频里面已经讲解的很清楚了,下面内容有些简略,就当补充下payload了。 文章目录 CTFSHOW 常用姿势篇 * web801 web802 …

    Python 2023年8月12日
    054
  • 用python写一个魂斗罗

    嗨!多一嘴: 童年玩过的经典游戏中,魂斗罗当属经典啊,最近用python写出来,赶一波回忆杀哈哈哈哈哈哈哈~ tips: 600多行代码,耐心耐心耐心!( 偷看*-||| 1、代码…

    Python 2023年9月23日
    027
  • pandas常用功能_2:数据合并merge

    python有多种数据合并的方法,在不同的场合我们可以使用不用的方法 merge可能是我们最熟悉,也最常用的一个方法,因为它的用法与mysql的连接(join)非常类似。 函数介绍…

    Python 2023年8月22日
    041
  • Python实现Eternal Night游戏(尚未完结,不断更新)

    Eternal Nigh是本人独立编写18天完成的游戏,本品尚未完结,请各位大佬多多指教(发私信给我),谢谢! 点个关注吧,关注必互关注 👩‍💻博客主页:孤雪落尘风的博客主页✨欢迎…

    Python 2023年9月23日
    043
  • python转float类型_python中从float到in的类型转换

    我认为您需要^{}首先,因为float不能强制转换为int:data_df[‘grade’] = pd.to_numeric(data_df[‘…

    Python 2023年8月20日
    048
  • Python 函数运行时间统计

    python;gutter:true; from functools import wraps import time</p> <p>def func_ti…

    Python 2023年6月3日
    078
  • pygame使用的有关问题

    def Draw(window): window.fill(black) for i in situation: #绘制普通部分 start_x = i["x"…

    Python 2023年9月22日
    040
  • python 中数组的基本操作

    文章目录 前言 一、numpy是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 在python中本身有着列表等数据结构,但是列表只是一种数据的存储容器,不具备任何计算能…

    Python 2023年8月23日
    049
  • ULID规范解读与实现原理

    前提 最近发现各个频道推荐了很多 ULID相关文章,这里对 ULID的规范文件进行解读,并且基于 Java语言自行实现 ULID,通过此实现过程展示 ULID的底层原理。 笔者尝试…

    Python 2023年10月18日
    065
  • Python学习之视频人脸检测识别

    Original: https://www.cnblogs.com/123456feng/p/16195175.htmlAuthor: 蚂蚁ailingTitle: Python学…

    Python 2023年11月3日
    030
  • Python图形用户界面和游戏开发

    对于使用过计算机的人,应该对图形用户界面(GUI)应该都不会太陌生,这里就不在赘述。那么对于python这样的动态语言有没有GUI相关的库呢?答案是肯定有的,那么常见的有哪些呢?主…

    Python 2023年9月18日
    049
  • Jupyter的使用

    Jupyter的使用 一、开启Jupyter Notebook * – + 1、 新建文件夹,名字随意(这里我新建的空文件夹为zaa),然后复制此文件夹的路径。 2 、…

    Python 2023年8月2日
    085
  • .NET周报【10月第3期 2022-10-25】

    国内文章 将Windows编程中经典的COM组件拿出来再复习一下,解释了COM组件互相调用的原理。 介绍一个开源的数据库组件,LiteDB 是一个小型、快速、轻量级的 .NET N…

    Python 2023年10月17日
    038
  • Python条件语句的用法

    python条件语句使用 if 表达式,难度不高,需要注意的是嵌套用法,以及如何设置对应的条件。 if 条件判断语句 python 语句是按固定顺序执行的,先执行前面的语句,再执行…

    Python 2023年6月11日
    071
  • Python实验

    实验1 Python编程基础 (1)在交互式环境中打印”Hello world”字符串。记录操作过程。 略 (2)创建脚本helloworld.py,在命令…

    Python 2023年8月22日
    057
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球