使用Python读取大文件的方法


Posted in Python onFebruary 11, 2018

背景

最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法。

准备工作

我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而.read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。下面是read()方法示例:

try:
f = open('/path/to/file', 'r')
print f.read()
finally:
if f:
f.close()

调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

for line in f.readlines():
process(line) #

分块读取

处理大文件是很容易想到的就是将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。这里用了iter 和 yield:

def read_in_chunks(filePath, chunk_size=1024*1024):
"""
Lazy function (generator) to read a file piece by piece.
Default chunk size: 1M
You can set your own chunk size
"""
file_object = open(filePath)
while True:
chunk_data = file_object.read(chunk_size)
if not chunk_data:
break
yield chunk_data
if __name__ == "__main__":
filePath = './path/filename'
for chunk in read_in_chunks(filePath):
process(chunk) # <do something with chunk>

使用With open()

with语句打开和关闭文件,包括抛出一个内部块异常。for line in f文件对象f视为一个迭代器,会自动的采用缓冲IO和内存管理,所以你不必担心大文件。

代码如下:

#If the file is line based
with open(...) as f:
for line in f:


process(line) # <do something with line>

优化

面对百万行的大型数据使用with open 是没有问题的,但是这里面参数的不同也会导致不同的效率。经过测试发先参数为"rb"时的效率是"r"的6倍。由此可知二进制读取依然是最快的模式。

with open(filename,"rb") as f: 
  for fLine in f: 
  pass

测试结果:rb方式最快,100w行全遍历2.9秒。基本能满足中大型文件处理效率需求。如果从rb(二级制读取)读取改为r(读取模式),慢5-6倍。

结论

在使用python进行大文件读取时,应该让系统来处理,使用最简单的方式,交给解释器,就管好自己的工作就行了。同时根据不同的需求可以选择不同的读取参数进一步获得更高的性能。

Python 相关文章推荐
Python脚本实现下载合并SAE日志
Feb 10 Python
python获得一个月有多少天的方法
Jun 04 Python
python检查指定文件是否存在的方法
Jul 06 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
Python3安装Pillow与PIL的方法
Apr 03 Python
Django中间件拦截未登录url实例详解
Sep 03 Python
python机器学习实现决策树
Nov 11 Python
Python3 读取Word文件方式
Feb 13 Python
Python urllib2运行过程原理解析
Jun 04 Python
Pytest之测试命名规则的使用
Apr 16 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 Python
python脚本作为Windows服务启动代码详解
Feb 11 #Python
分析Python读取文件时的路径问题
Feb 11 #Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 #Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 #Python
代码讲解Python对Windows服务进行监控
Feb 11 #Python
django 按时间范围查询数据库实例代码
Feb 11 #Python
python实现媒体播放器功能
Feb 11 #Python
You might like
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
webpack打包单页面如何引用的js
2017/06/07 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
[52:22]EG vs VG Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
基于python实现简单C/S模式代码实例
2020/09/14 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
C++是不是类型安全的
2014/02/18 面试题
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
《在家里》教后反思
2014/03/01 职场文书
出国留学经济担保书
2014/04/01 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
总经理岗位职责范本
2015/04/01 职场文书
团支部书记竞选稿
2015/11/21 职场文书