使用Python读取大文件的方法

 更新时间:2018年02月11日 14:21:51   作者:DB乐之者  
这篇文章主要介绍了使用Python读取大文件的方法,需要的朋友可以参考下

背景

最近处理文本文档时(文件约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+pyecharts绘制双动态曲线教程详解

    Python+pyecharts绘制双动态曲线教程详解

    pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒。本文将用pyecharts绘制双动态曲线,需要的可以参考一下
    2022-06-06
  • python selenium模拟点击问题解决方案

    python selenium模拟点击问题解决方案

    这篇文章主要介绍了python selenium模拟点击问题,涉及到安装谷歌浏览器和浏览器驱动的相关知识介绍,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Python解决爬虫程序卡死问题

    Python解决爬虫程序卡死问题

    这篇文章主要介绍了Python解决爬虫程序卡死问题,文章围绕主题展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • Python使用Pendulum优雅处理日期与时间

    Python使用Pendulum优雅处理日期与时间

    在日常开发中,日期和时间的处理一直是让人头疼的事情,本文将全面介绍 pendulum 的特点,用法以及典型应用场景,希望可以帮助大家在实际项目中优雅地处理时间逻辑
    2025-06-06
  • 极速整理文件Python自动化办公实用技巧

    极速整理文件Python自动化办公实用技巧

    当涉及到自动化办公和文件整理,Python确实是一个强大的工具,在这篇博客文章中,将深入探讨极速整理文件!Python自动化办公新利器这个话题,并提供更加丰富和全面的示例代码,以便读者更好地理解和运用这些技巧
    2024-01-01
  • Python os和os.path模块详情

    Python os和os.path模块详情

    这篇文章主要介绍了Python os和os.path模块详情,文章围绕主题展开详细的相关内容,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-04-04
  • 使用Python设置Excel工作表的页眉和页脚的代码示例

    使用Python设置Excel工作表的页眉和页脚的代码示例

    在处理和分析数据时,Excel作为一款功能强大的工具,被广泛应用于各个领域,当涉及到打印或分享工作表时,为文档添加专业的页眉和页脚不仅能提升文件的视觉效果,本文将介绍如何使用Python设置Excel工作表的页眉和页脚,需要的朋友可以参考下
    2024-12-12
  • python中的list字符串元素排序

    python中的list字符串元素排序

    这篇文章主要介绍了python中的list字符串元素排序方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Python构造函数及解构函数介绍

    Python构造函数及解构函数介绍

    这篇文章主要介绍了Python构造函数及解构函数介绍,本文只是讲解构造及解构函数的简单知识,需要的朋友可以参考下
    2015-02-02
  • python [:3] 实现提取数组中的数

    python [:3] 实现提取数组中的数

    今天小编就为大家分享一篇python [:3] 实现提取数组中的数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11

最新评论