python3读取文件指定行的三种方法


Posted in Python onMay 24, 2021

行遍历实现

在python中如果要将一个文件完全加载到内存中,通过file.readlines()即可,但是在文件占用较高时,我们是无法完整的将文件加载到内存中的,这时候就需要用到python的file.readline()进行迭代式的逐行读取:

filename = 'hello.txt'

with open(filename, 'r') as file:
    line = file.readline()
    counts = 1
    while line:
        if counts >= 50000000:
            break
        line = file.readline()
        counts += 1

这里我们的实现方式是先用一个with语句打开一个文件,然后用readline()函数配合while循环逐行加载,最终通过一个序号标记来结束循环遍历,输出文件第50000000行的内容。该代码的执行效果如下:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py 

real    0m10.359s
user    0m10.062s
sys     0m0.296s

可以看到这里的耗时为10s多一些。

linecache实现

虽然在python的readline函数中并没有实现读取指定行内容的方案,但是在另一个库linecache中是实现了的,由于使用的方式较为简单,这里直接放上代码示例供参考:

filename = 'hello.txt'

import linecache
text = linecache.getline(filename, 50000000)

该代码的执行结果如下:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py 

real    0m11.904s
user    0m5.672s
sys     0m6.231s

虽然在实现方式上简化了许多,但是我们发现这个实现的用时超过了11s,还不如我们自己手动实现的循环遍历方案。因此如果是对于性能有一定要求的场景,是不建议采用这个方案的。

命令行sed获取

我们知道用Linux系统本身自带的sed指令也是可以获取到文件指定行或者是指定行范围的数据的,其执行指令为:sed -n 50000000p filename即表示读取文件的第50000000行的内容。同时结合python的话,我们可以在python代码中执行系统指令并获取输出结果:

filename = 'hello.txt'

import os
result = os.popen('sed -n {}p {}'.format(50000000, filename)).read()

需要注意的是,如果直接运行os.system()是没有返回值的,只有os.popen()是有返回值的,并且需要在尾巴加上一个read()的选项。该代码的执行结果如下:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py 

real    0m2.532s
user    0m0.032s
sys     0m0.020s

可以看到直接使用sed指令的执行速度很快,但是用这种方法并不是一本万利的,比如以下这个例子:

filename = 'hello.txt'

import os
result = os.popen('sed -n {}p {}'.format(500, filename)).read()

我们把读取第50000000行内容改为读取第500行的内容,再运行一次程序:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py 

real    0m2.540s
user    0m0.037s
sys     0m0.013s

然而我们发现这个速度并没有因为要读取的行数减少了而变少,而是几乎保持不变的。

总结概要

本文通过4个测试案例分析了在python中读取文件指定行内容的方案,并得到了一些运行耗时的数据。从需求上来说,如果是对于小规模的数据,比如几百行规模的数据,建议使用readline循环遍历来操作,速度也相当不错,或者是linecache中的函数实现也是可以的,甚至可以直接用readlines将整个文本内容加载到内存中。但是对于数据规模比较大的场景,比如超过了千万行的级别,那么使用sed指令的方式对指定行内容进行读取的方式,应该是所有方式中最快速的。

本文首发链接为:https://www.cnblogs.com/dechinphy/p/lbl.html

作者ID:DechinPhy

以上就是python3读取文件指定行的三种方法的详细内容,更多关于python读取文件指定行的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python微信库:itchat的用法详解
Aug 14 Python
Python实现随机选择元素功能
Sep 14 Python
Python自动化运维之IP地址处理模块详解
Dec 10 Python
用python处理MS Word的实例讲解
May 08 Python
python多线程调用exit无法退出的解决方法
Feb 18 Python
利用PyCharm Profile分析异步爬虫效率详解
May 08 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
Python如何根据时间序列数据作图
May 12 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 #Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
May 24 #Python
pytorch交叉熵损失函数的weight参数的使用
May 24 #Python
pytorch 实现变分自动编码器的操作
May 24 #Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 #Python
Python基础之函数嵌套知识总结
May 23 #Python
利用python Pandas实现批量拆分Excel与合并Excel
May 23 #Python
You might like
文件上传的实现
2006/10/09 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
PHP实现C#山寨ArrayList的方法
2015/07/16 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
jquery中常用的SET和GET
2009/01/13 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
js保存当前路径(cookies记录)
2010/12/14 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
2016/09/02 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
深入解读Node.js中的koa源码
2019/06/17 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
用python编写第一个IDA插件的实例
2018/05/29 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
python dict乱码如何解决
2020/06/07 Python
python中get和post有什么区别
2020/06/19 Python
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
大学学习计划书范文
2014/05/02 职场文书
优秀员工评优方案
2014/06/13 职场文书
Django实现drf搜索过滤和排序过滤
2021/06/21 Python
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python