利用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读取json文件并将数据插入到mongodb的方法
Mar 23 Python
浅谈django model postgres的json字段编码问题
Jan 05 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
修改默认的pip版本为对应python2.7的方法
Nov 06 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
基于python实现名片管理系统
Nov 30 Python
使用Python实现跳帧截取视频帧
May 31 Python
python做反被爬保护的方法
Jul 01 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
Python3和pyqt5实现控件数据动态显示方式
Dec 13 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
Apr 26 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
PHP 七大优势分析
2009/06/23 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php日期操作技巧小结
2016/06/25 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
分析Python中解析构建数据知识
2018/01/20 Python
python学习基础之循环import及import过程
2018/04/22 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
Python实现Dijkstra算法
2018/10/17 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
计算机科学系职业生涯规划书
2014/03/08 职场文书
学校安全管理责任书
2014/07/23 职场文书
党支部对转正的意见
2015/06/02 职场文书
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android