使用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 21 Python
python中快速进行多个字符替换的方法小结
Dec 15 Python
详解Python核心编程中的浅拷贝与深拷贝
Jan 07 Python
PyQt5每天必学之组合框
Apr 20 Python
Python实现拷贝/删除文件夹的方法详解
Aug 29 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
python有序查找算法 二分法实例解析
Feb 18 Python
python实现图片横向和纵向拼接
Mar 05 Python
Pycharm github配置实现过程图解
Oct 13 Python
python实现A*寻路算法
Jun 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
smarty section简介与用法分析
2008/10/03 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
遍历jquery对象的代码分享
2011/11/02 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
javascript操作excel生成报表全攻略
2014/05/04 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
python安装与使用redis的方法
2016/04/19 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python 错误和异常代码详解
2018/01/29 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
高中毕业生自我鉴定范文
2013/09/26 职场文书
医学生职业规划范文
2014/01/05 职场文书
社保转移委托书范本
2014/10/08 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
小学大队委竞选口号
2015/12/25 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
python的变量和简单数字类型详解
2021/09/15 Python
基于Python实现对比Exce的工具
2022/04/07 Python