使用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 相关文章推荐
Django与遗留的数据库整合的方法指南
Jul 24 Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 Python
Pytorch入门之mnist分类实例
Apr 14 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
详解Python的循环结构知识点
May 20 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
python使用socket 先读取长度,在读取报文内容示例
Sep 26 Python
解决torch.autograd.backward中的参数问题
Jan 07 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
Feb 17 Python
Django 允许局域网中的机器访问你的主机操作
May 13 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
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
Javascript倒计时代码
2010/08/12 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
Python AES加密实例解析
2018/01/18 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
python实现移位加密和解密
2019/03/22 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
如何使用python进行pdf文件分割
2019/11/11 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
沈阳故宫导游词
2015/01/31 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
Python如何让字典保持有序排列
2022/04/29 Python