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 中文乱码问题深入分析
Mar 13 Python
python 控制语句
Nov 03 Python
python利用hook技术破解https的实例代码
Mar 25 Python
在Python中使用Neo4j数据库的教程
Apr 16 Python
用Python登录好友QQ空间点赞的示例代码
Nov 04 Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
Win10 安装PyCharm2019.1.1(图文教程)
Sep 29 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
Python如何把不同类型数据的json序列化
Apr 30 Python
Python实现聚类K-means算法详解
Jul 15 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
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
php 数组使用详解 推荐
2011/06/02 PHP
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
如何快速的呈现我们的网页的技巧整理
2007/07/01 Javascript
js树插件zTree获取所有选中节点数据的方法
2015/01/28 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
2018/12/20 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
python中zip和unzip数据的方法
2015/05/27 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
Python中datetime模块参考手册
2017/01/13 Python
浅谈pyhton学习中出现的各种问题(新手必看)
2017/05/17 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
Python守护进程实现过程详解
2020/02/10 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
python 数据类型强制转换的总结
2021/01/25 Python
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
十佳大学生村官事迹
2014/01/09 职场文书
个人委托书怎么写
2014/04/04 职场文书
餐厅筹备计划书
2014/04/25 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
公司放假通知怎么写
2015/04/15 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
电话营销开场白
2015/05/29 职场文书