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中内置的NotImplemented类型的用法
Mar 31 Python
python开发之thread实现布朗运动的方法
Nov 11 Python
python Flask实现restful api service
Dec 04 Python
python通过elixir包操作mysql数据库实例代码
Jan 31 Python
Python处理文本换行符实例代码
Feb 03 Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 Python
python实现RabbitMQ的消息队列的示例代码
Nov 08 Python
Python 最大概率法进行汉语切分的方法
Dec 14 Python
python requests post多层字典的方法
Dec 27 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
Python面向对象编程之类的概念
Nov 01 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中运用http调用的GET和POST方法示例
2014/09/29 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
基于wordpress的ajax写法详解
2018/01/02 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
python数据结构学习之实现线性表的顺序
2018/09/28 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
Python 互换字典的键值对实例
2019/02/12 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
泰国网上购物:Shopee泰国
2018/09/14 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
商务考察邀请函范文
2014/01/21 职场文书
经典商业广告词
2014/03/13 职场文书
预防煤气中毒方案
2014/06/16 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
第一书记观后感
2015/06/08 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
导游词之无锡东林书院
2019/12/11 职场文书