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 相关文章推荐
安装dbus-python的简要教程
May 05 Python
Python中encode()方法的使用简介
May 18 Python
python基于右递归解决八皇后问题的方法
May 25 Python
python退出命令是什么?详解python退出方法
Dec 10 Python
Python3数字求和的实例
Feb 19 Python
python中metaclass原理与用法详解
Jun 25 Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 Python
python如何从文件读取数据及解析
Sep 19 Python
Python 中pandas索引切片读取数据缺失数据处理问题
Oct 09 Python
Python求平面内点到直线距离的实现
Jan 19 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
keras中epoch,batch,loss,val_loss用法说明
Jul 02 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
php获取文件名后缀常用方法小结
2015/02/24 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
angular2中Http请求原理与用法详解
2018/01/11 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
python selenium登录豆瓣网过程解析
2019/08/10 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
乐天旅游台湾网站:Rakuten Travel TW
2017/06/01 全球购物
机械制造专业个人的自我评价
2013/12/28 职场文书
个人融资协议书范本两则
2014/10/15 职场文书
公司职员入党自传书
2015/06/26 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
导游词之舟山普陀山
2019/11/06 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis