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通过urllib2爬网页上种子下载示例
Feb 24 Python
Python实现登录人人网并抓取新鲜事的方法
May 11 Python
答题辅助python代码实现
Jan 16 Python
python实现数据写入excel表格
Mar 25 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
java判断三位数的实例讲解
Jun 10 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
python迭代器常见用法实例分析
Nov 22 Python
PyCharm 光标变成黑块的解决方式
Feb 06 Python
Python使用scapy模块发包收包
May 07 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框架的优缺点对比分析
2014/12/25 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
Prototype String对象 学习
2009/07/19 Javascript
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
Python中%r和%s的详解及区别
2017/03/16 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
Java平台和其他软件平台有什么不同
2015/06/05 面试题
工商管理本科毕业生求职信范文
2013/10/05 职场文书
社会保险接收函
2014/01/12 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
大雁塔英文导游词
2015/02/10 职场文书
2015年幼儿园班主任工作总结
2015/05/12 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
Python Pandas常用函数方法总结
2021/06/15 Python
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers