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中处理字符串之endswith()方法的使用简介
May 18 Python
python实现mysql的单引号字符串过滤方法
Nov 14 Python
Python2实现的图片文本识别功能详解
Jul 11 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
Oct 21 Python
对Python信号处理模块signal详解
Jan 09 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
利用python开发app实战的方法
Jul 09 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
May 13 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
Jun 09 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
PHP array_multisort() 函数的深入解析
2013/06/20 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
React快速入门教程
2017/01/17 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
python3.3实现乘法表示例
2014/02/07 Python
Python遍历目录的4种方法实例介绍
2015/04/13 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
python中的随机函数小结
2018/01/27 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
ASP.NET Core中的配置详解
2021/02/05 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
出纳岗位职责范本
2013/12/01 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
会计实训报告范文
2014/11/04 职场文书
大学生就业指导课心得体会
2016/01/15 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android