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分割和拼接字符串
Nov 01 Python
Python中使用item()方法遍历字典的例子
Aug 26 Python
Python按行读取文件的实现方法【小文件和大文件读取】
Sep 19 Python
python字符串过滤性能比较5种方法
Jun 22 Python
Python3 伪装浏览器的方法示例
Nov 23 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
python实现windows下文件备份脚本
May 27 Python
Django rest framework工具包简单用法示例
Jul 20 Python
numpy中的meshgrid函数的使用
Jul 31 Python
如何解决安装python3.6.1失败
Jul 01 Python
python操作ini类型配置文件的实例教程
Oct 30 Python
Python字符串的15个基本操作(小结)
Feb 03 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的优缺点
2015/07/14 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
PHP实现的各类hash算法长度及性能测试实例
2017/08/27 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
php post换行的方法
2020/02/03 PHP
鼠标事件延时切换插件
2011/03/12 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python实现全局变量的两个解决方法
2014/07/03 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
Python中的localtime()方法使用详解
2015/05/22 Python
浅谈django model postgres的json字段编码问题
2018/01/05 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
python爬取股票最新数据并用excel绘制树状图的示例
2021/03/01 Python
德国旅游网站:weg.de
2018/06/03 全球购物
小学生自我评价范例
2013/09/24 职场文书
绩效工资实施方案
2014/03/15 职场文书
助人为乐好少年事迹材料
2014/08/18 职场文书