使用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检测网页是否有日常链接
Jun 03 Python
python中as用法实例分析
Apr 30 Python
Python字符串替换实例分析
May 11 Python
Python第三方库的安装方法总结
Jun 06 Python
Python3.4编程实现简单抓取爬虫功能示例
Sep 14 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
利用Python如何实现数据驱动的接口自动化测试
May 11 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 Python
在keras中实现查看其训练loss值
Jun 16 Python
pyqt5蒙版遮罩mask,setmask的使用
Jun 11 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
thinkphp浏览历史功能实现方法
2014/10/29 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
JQuery 遮罩层实现(mask)实现代码
2010/01/09 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
意大利领先的线上奢侈品销售电商:Eleonora Bonucci
2017/10/17 全球购物
酒店管理求职信
2014/06/09 职场文书
授权收款委托书
2014/09/23 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
铁路安全反思材料
2014/12/24 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
MongoDB数据库的安装步骤
2021/06/18 MongoDB
MySQL 原理与优化之Update 优化
2022/08/14 MySQL