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

适用场景:

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

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

反向读取大文件,主要依据:
  • 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/814554/

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

(0)

大家都在看

  • python中创建多个按钮_flask表单怎么添加多个按钮

    表单添加多个提交按钮 在某些情况下,可能需要为一个表单添加多个提交按钮。比如在创建文章的表单中添加发布按钮和存草稿的按钮。当用户提交表单时,需要在视图函数中根据按下的按钮来做出不同…

    Python 2023年8月13日
    066
  • 千年荒漠变绿洲,看沙漠“卫士”携手昇腾AI植起绿色希望

    摘要:风沙肆虐,沙漠侵蚀神州大地,华东师范大学基于昇腾AI基础软硬件平台研制的种树机器人成为沙漠”卫士”,穿越戈壁,跨越千里,为荒漠治理贡献力量!华师大携手…

    Python 2023年10月29日
    047
  • 第三天博客

    1.django命令 创建django项目: django-admin startproject 项目名 创建子应用: python .\manage.py startapp 子应…

    Python 2023年8月4日
    076
  • 2022年“网络安全”赛项黑龙江省赛选拔赛 任务书

    一、竞赛时间共计6小时。项目和任务描述:假定你是某企业的网络安全工程师,对于企业的服务器系统,根据任务要求确保各服务正常运行,并通过综合运用登录和密码策略、流量完整性保护策略、事件…

    Python 2023年11月9日
    035
  • 群智能算法 第5关:动手实现旅行商问题

    本关任务:使用 python 实现遗传算法解决 TSP 问题。 为了完成本关任务,你需要掌握:1.使用遗传算法解决 TSP 问题。 使用遗传算法解决TSP问题。 蚁群算法对于参数的…

    Python 2023年8月26日
    064
  • Titanic数据分析

    背景 题目参见:Titanic实际就是根据乘客的性别、年龄、舱位等级等信息预测乘客的成活率。很多人也说这个数据集比较小,使用一些tricky的技术提高准群率意义不大,但是作为练手的…

    Python 2023年8月16日
    064
  • Windows环境下使用conda安装pytorch

    1、首先安装anaconda3(Python3.7以上),并查看Python版本。 2、单击启动Anaconda Prompt,去创建pytorch的虚拟环境: conda cre…

    Python 2023年9月7日
    058
  • 实训报告总结

    目录 一、实训项目 (一)学生管理系统 二、项目介绍 (一)学生管理系统项目介绍 三、实训内容步骤 (一)学生管理系统步骤 (二)功能完善 四、项目展示 (一)添加学生信息 (二)…

    Python 2023年8月4日
    070
  • Django前后端分离项目Channels + Daphne + Nginx部署

    我有个业务逻辑是前端用户点击某个文件夹的下载按钮,会同时触发两个函数,·第一个函数是服务端接收到该文件夹路径并开始将其压缩成zip然后返回该zip包实现用户下载功能,第二个函数是后…

    Python 2023年8月4日
    087
  • pytest之fixture使用详解

    pytest之fixture使用详解 usefixtures与传fixture区别 1、如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usef…

    Python 2023年9月12日
    052
  • 数据分析工具Pandas

    .Pandas的数据结构分析 Series :类似一维数组的对象,它能够保存任何类型的数据,主要由一组数据和与之相关的索引两部分构成。 构造方法创建:class pandas.Se…

    Python 2023年8月20日
    051
  • 学习panda df.loc[] 选取行列区域

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年8月16日
    044
  • 【Python 实战基础】Pandas 如何修改表格数据类型 DataFrame 列的顺序

    一、实战场景 二、主要知识点 文件读写 基础语法 数据构建 Pandas Numpy 三、菜鸟实战 1、创建 python 文件 2、运行结果 实战场景:Pandas 如何修改表格…

    Python 2023年8月7日
    069
  • Flask逻辑——视图高级与蓝图

    文章目录 一、标准类视图 * 模板 案例 二、基于调图方法的视图(视图方法) – get和post 模板中显示错误 优化post 三、视图函数、类视图与装饰器 &#82…

    Python 2023年8月14日
    046
  • xml的学习和使用python解析读取xml文件

    XML的介绍 XML 指可扩展标记语言(EXtensible Markup Language)。 和json类似也是用于存储和传输数据,还可以用作配置文件。 类似于HTML超文本标…

    Python 2023年8月2日
    059
  • K8s架构|全面整理K8s的架构介绍

    K8S架构与核心技术介绍 参考文献:https://jimmysong.io/kubernetes-handbook/concepts/concepts.htmlhttps://w…

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