利用Python读取文件的四种不同方法比对


Posted in Python onMay 18, 2017

前言

大家都知道Python 读文件的方式多种多样,但是当需要读取一个大文件的时候,不同的读取方式会有不一样的效果。下面就来看看详细的介绍吧。

场景

逐行读取一个 2.9G 的大文件

  • CPU i7 6820HQ
  • RAM 32G

方法

对每一行的读取进行一次分割字符串操作

以下方法都使用 with…as 方法打开文件。

with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

方法一 最通用的读文件方式

with open(file, 'r') as fh:
 for line in fh.readlines():
 line.split("|")

运行结果: 耗时 15.4346568584 秒

系统监视器中显示内存从 4.8G 一下子飙到了 8.4G, fh.readlines() 将读取的所有行数据存到内存,这种方法适合小文件。

方法二

with open(file, 'r') as fh:
 line = fh.readline()
 while line:
 line.split("|")

运行结果: 耗时 22.3531990051 秒

内存几乎没有变化,因为内存中只存取一行的数据,但是时间明显比上一次的长,对于进一步处理数据来说效率不高。

方法三

with open(file) as fh:
 for line in fh:
 line.split("|")

运行结果: 耗时 13.9956979752 秒

内存几乎没有变化,速度也比方法二快。

for line in fh 将文件对象 fh 视为可迭代的,它自动使用缓冲的 IO 和内存管理,因此您不必担心大文件。这是很 pythonic 的方式!

方法四 fileinput 模块

for line in fileinput.input(file):
 line.split("|")

运行结果: 耗时 26.1103110313 秒

内存增加了 200-300 MB,速度是以上最慢的。

总结

以上方法仅供参考,公认的大文件读取方法还是三最好。但是具体情况还是要根据机器的性能、处理数据的复杂度。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python检测远程udp端口是否打开的方法
Mar 14 Python
Python入门之modf()方法的使用
May 15 Python
在Python中用keys()方法返回字典键的教程
May 21 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
Python函数any()和all()的用法及区别介绍
Sep 14 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
python三方库之requests的快速上手
Mar 04 Python
python异常处理try except过程解析
Feb 03 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
python如何安装下载后的模块
Jul 03 Python
如何理解及使用Python闭包
Jun 01 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 #Python
Python使用time模块实现指定时间触发器示例
May 18 #Python
Python实现的文本简单可逆加密算法示例
May 18 #Python
Python操作MongoDB详解及实例
May 18 #Python
Python 迭代器与生成器实例详解
May 18 #Python
Python字符串处理实例详解
May 18 #Python
Python进阶-函数默认参数(详解)
May 18 #Python
You might like
Windows下PHP的任意文件执行漏洞
2006/10/09 PHP
PHP中strtotime函数使用方法详解
2011/11/27 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
微信小程序开发常见问题及解决方案
2019/07/11 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
python用字典统计单词或汉字词个数示例
2014/04/22 Python
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Python类的动态修改的实例方法
2017/03/24 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
Django CBV类的用法详解
2019/07/26 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
简单的命令查看安装的python版本号
2020/08/28 Python
python如何设置静态变量
2020/09/07 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
物业总经理岗位职责
2014/02/28 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
二审答辩状格式
2015/05/22 职场文书
工作会议简报
2015/07/20 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python