使用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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
浅析Python中的赋值和深浅拷贝
Aug 15 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
Jul 10 Python
transform python环境快速配置方法
Sep 27 Python
Python对象中__del__方法起作用的条件详解
Nov 01 Python
python经典趣味24点游戏程序设计
Jul 26 Python
关于Python-faker的函数效果一览
Nov 28 Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 Python
python字符串判断密码强弱
Mar 18 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录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
PHP持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
Javascript 读书笔记索引贴
2010/01/11 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
javascript与cookie 的问题详解
2013/11/11 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
Bootstrap风格的WPF样式
2016/12/07 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
python实现矩阵乘法的方法
2015/06/28 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
python多进程实现文件下载传输功能
2018/07/28 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
python判断无向图环是否存在的示例
2019/11/22 Python
python3.4中清屏的处理方法
2020/07/06 Python
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
感恩节红领巾广播稿
2014/02/11 职场文书
残疾人小组计划书
2014/04/27 职场文书
工作说明书范文
2014/05/07 职场文书
诚实守信演讲稿
2014/09/01 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
《迟到》教学反思
2016/02/24 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python