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 算法 排序实现快速排序
Jun 05 Python
Python中的zip函数使用示例
Jan 29 Python
浅谈python中的数字类型与处理工具
Aug 02 Python
Python基于多线程操作数据库相关问题分析
Jul 11 Python
python实现学员管理系统
Feb 26 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
Python openpyxl读取单元格字体颜色过程解析
Sep 03 Python
python selenium 执行完毕关闭chromedriver进程示例
Nov 15 Python
wxpython绘制音频效果
Nov 18 Python
python时间日期操作方法实例小结
Feb 06 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 Python
Python+Appium自动化测试的实战
Jun 30 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读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
JS实现身份证输入框的输入效果
2017/08/21 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python的另外几种语言实现
2015/01/29 Python
python实现简单温度转换的方法
2015/03/13 Python
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
Pythonic版二分查找实现过程原理解析
2020/08/11 Python
全球在线商店:BerryLook
2019/04/14 全球购物
数组越界问题
2015/10/21 面试题
药物学专业学生的自我评价
2013/10/27 职场文书
如何写你的创业计划书
2014/01/07 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
青年教师个人总结
2015/02/11 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript