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中的map()函数和reduce()函数的用法
Apr 27 Python
Centos Python2 升级到Python3的简单实现
Jun 21 Python
python一键升级所有pip package的方法
Jan 16 Python
pandas object格式转float64格式的方法
Apr 10 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
python进行两个表格对比的方法
Jun 27 Python
使用PIL(Python-Imaging)反转图像的颜色方法
Jan 24 Python
Django异步任务之Celery的基本使用
Mar 23 Python
python取均匀不重复的随机数方式
Nov 27 Python
python3 求约数的实例
Dec 05 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
PHP Session变量不能传送到下一页的解决方法
2009/11/27 PHP
JavaScript中对象介绍
2014/12/31 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
2017/02/13 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
python中的错误处理
2016/04/10 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
Python流程控制 if else实现解析
2019/09/02 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
如何基于python实现不邻接植花
2020/05/01 Python
python 深度学习中的4种激活函数
2020/09/18 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
python实现计算器简易版
2020/12/17 Python
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
娱乐地球:Entertainment Earth
2020/01/08 全球购物
师德模范事迹材料
2014/06/03 职场文书
老兵退伍标语
2014/10/07 职场文书
万能检讨书
2015/01/27 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
pytorch实现手写数字图片识别
2021/05/20 Python
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript