使用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中使用base64模块处理字符编码的教程
Apr 28 Python
使用PyV8在Python爬虫中执行js代码
Feb 16 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
django-allauth入门学习和使用详解
Jul 03 Python
详解DeBug Python神级工具PySnooper
Jul 03 Python
django fernet fields字段加密实践详解
Aug 12 Python
简单分析python的类变量、实例变量
Aug 23 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
Python如何基于selenium实现自动登录博客园
Dec 16 Python
Python操作Sqlite正确实现方法解析
Feb 05 Python
python 使用三引号时容易犯的小错误
Oct 21 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
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
详解JS函数重载
2014/12/04 Javascript
javascript arguments使用示例
2014/12/16 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
Python生成pdf文件的方法
2014/08/04 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Python 加密与解密小结
2018/12/06 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
django rest framework 自定义返回方式
2020/07/12 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
远程调用的原理
2014/07/05 面试题
安全资料员岗位职责范本
2014/06/28 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
致接力运动员加油稿
2015/07/21 职场文书
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏