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类继承用法实例分析
Oct 10 Python
python Django批量导入不重复数据
Mar 25 Python
python读写json文件的简单实现
Apr 11 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
Python中 传递值 和 传递引用 的区别解析
Feb 22 Python
mac下pycharm设置python版本的图文教程
Jun 13 Python
Django model序列化为json的方法示例
Oct 16 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
浅谈对python中if、elif、else的误解
Aug 20 Python
Python如何获取文件路径/目录
Sep 22 Python
Python实现文字pdf转换图片pdf效果
Apr 03 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
javascript之大字符串的连接的StringBuffer 类
2007/05/08 Javascript
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
基于jquery封装的一个js分页
2011/11/15 Javascript
JS定时器实例
2013/04/17 Javascript
同域jQuery(跨)iframe操作DOM(实例讲解)
2013/12/19 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
Python 异常处理实例详解
2014/03/12 Python
python基础教程之自定义函数介绍
2014/08/29 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
2020/08/05 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
毕业学生推荐信
2013/12/01 职场文书
演讲稿怎么写才完美
2014/01/02 职场文书
五四演讲稿范文
2014/09/03 职场文书
学生会个人总结范文
2015/02/15 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
python实现自定义日志的具体方法
2021/05/28 Python
python3操作redis实现List列表实例
2021/08/04 Python
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android
Python保存并浏览用户的历史记录
2022/04/29 Python
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL