使用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装饰器初探(推荐)
Jul 21 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
Python中函数参数调用方式分析
Aug 09 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
Python设计模式之状态模式原理与用法详解
Jan 15 Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 Python
numpy.where() 用法详解
May 27 Python
Python语法分析之字符串格式化
Jun 13 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
Jun 21 Python
python实现通过flask和前端进行数据收发
Aug 22 Python
python 实现保存最新的三份文件,其余的都删掉
Dec 22 Python
matplotlib 多个图像共用一个colorbar的实现示例
Sep 10 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
使用数据库保存session的方法
2006/10/09 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
js实现分割上传大文件
2016/03/09 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
JS作用域深度解析
2016/12/29 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
Python连接SQLServer2000的方法详解
2017/04/19 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
python requests使用socks5的例子
2019/07/25 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
Python实现图像的垂直投影示例
2020/01/17 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
amazeui页面分析之登录页面的示例代码
2020/08/25 HTML / CSS
澳大利亚工具仓库:Tools Warehouse
2018/10/15 全球购物
巴基斯坦购物网站:Goto
2019/03/11 全球购物
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
护士进修自我鉴定
2014/02/07 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
优乐美广告词
2014/03/14 职场文书
产品销售计划书
2014/05/04 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS