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发送HTTP请求的方法小结
Jul 08 Python
详解Python中的__new__、__init__、__call__三个特殊方法
Jun 02 Python
python的dataframe转换为多维矩阵的方法
Apr 11 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
Apr 20 Python
将python代码和注释分离的方法
Apr 21 Python
python实现大文件分割与合并
Jul 22 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
python通过opencv实现图片裁剪原理解析
Jan 19 Python
Python super()方法原理详解
Mar 31 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
matplotlib grid()设置网格线外观的实现
Feb 22 Python
python中的被动信息搜集
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
PHP实现用户认证及管理完全源码
2007/03/11 PHP
PHP求小于1000的所有水仙花数的代码
2012/01/10 PHP
解析php取整的几种方式
2013/06/25 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
js插件实现图片滑动验证码
2020/09/29 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
Vue实现验证码功能
2019/12/03 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
python pygame实现2048游戏
2018/11/20 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
Python实现序列化及csv文件读取
2020/01/19 Python
python实现从ftp服务器下载文件
2020/03/03 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
Linux文件系统类型
2012/09/16 面试题
你们项目是如何进行变更控制的
2015/08/26 面试题
本科生学习总结的自我评价
2013/10/02 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
JS前端轻量fabric.js系列物体基类
2022/08/05 Javascript