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自动化运维和部署项目工具Fabric使用实例
Sep 18 Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 Python
Python 模块EasyGui详细介绍
Feb 19 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
Python判断中文字符串是否相等的实例
Jul 06 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
python 中xpath爬虫实例详解
Aug 26 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
python3安装OCR识别库tesserocr过程图解
Apr 02 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
Python3 用什么IDE开发工具比较好
Nov 28 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与数据库代码开发规范
2013/08/08 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
input 高级限制级用法
2009/03/26 Javascript
javascript 鼠标滚轮事件
2009/04/09 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
Spring Boot/VUE中路由传递参数的实现代码
2018/03/02 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
Python实现字符串格式化的方法小结
2017/02/20 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
Python字符串和字典相关操作的实例详解
2017/09/23 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
对python中的高效迭代器函数详解
2018/10/18 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
Python之Matplotlib文字与注释的使用方法
2020/06/18 Python
Daniel Wellington官方海外旗舰店:丹尼尔惠灵顿DW手表
2018/02/22 全球购物
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
怎样从/向数据文件读/写结构
2014/11/23 面试题
2014年妇幼保健工作总结
2014/12/08 职场文书
单位接收函格式
2015/01/30 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
golang协程池模拟实现群发邮件功能
2021/05/02 Golang
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers