利用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 解析html之BeautifulSoup
Jul 07 Python
对Python新手编程过程中如何规避一些常见问题的建议
Apr 01 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
Django之使用celery和NGINX生成静态页面实现性能优化
Oct 08 Python
Python Websocket服务端通信的使用示例
Feb 25 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
Feb 26 Python
Python3如何判断三角形的类型
Apr 12 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
TensorFlow中tf.batch_matmul()的用法
Jun 02 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
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
PHP分享图片的生成方法
2018/04/25 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
vue调用语音播放的方法
2019/09/27 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
Vue中fragment.js使用方法小结
2020/02/17 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
python多线程http下载实现示例
2013/12/30 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
2018/05/10 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
2019/01/08 Python
python实现TCP文件传输
2020/03/20 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
2019年c语言经典面试题目
2016/08/17 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
工地资料员岗位职责
2013/12/31 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
大学学习计划书范文
2014/05/02 职场文书
入党介绍人评语
2014/05/06 职场文书
教师节宣传方案
2014/05/23 职场文书
个人务虚会发言材料
2014/10/20 职场文书
教师学期末个人总结
2015/02/13 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis