背景

最近处理文本文档时(文件约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) #

使用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) #

优化

面对百万行的大型数据使用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读取大文件的方法

本文地址: http://www.cppcns.com/jiaoben/python/220642.html

python读取大文件-使用Python读取大文件的方法相关推荐

  1. python一次性读取整个文件-使用Python读取大文件的方法

    背景 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. 准备工作 ...

  2. python中0xff_强悍的Python读取大文件的解决方案

    这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件. 1. read() 接口的问题 f =open(filename, ...

  3. python读取fiddler_大数据采集之python的docker爬虫技术-fiddler抓包软件详细配置(7)...

    本篇文章探讨了大数据采集之python的docker爬虫技术-fiddler抓包软件详细配置(7),希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. 挑选常用的功能给各位老铁介绍下 ...

  4. python各种文件数据的读取

    (持续更新中-) 文章目录 (持续更新中...) 0 常规方法open 0.1 读取时存在中文无法识别 0.2 写入,写入中文 1.读取excel文件 一)python读取: 2.读取csv文件 一) ...

  5. python从文件中读取数据_使用Python脚本从文件读取数据代码实例

    这篇文章主要介绍了使用Python脚本从文件读取数据代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近自学Python的进度比较慢,工作之 ...

  6. python读取文件夹-Python按顺序读取文件夹中文件

    参考资料: 涉及到文件操作,我们有时候会读取一个文件夹中的所有的文件.这些文件可能是文件名完全混乱的,也可能是完全格式化的(如1.png,2.png...).下面介绍Python中的几种按顺序(假如有 ...

  7. python如何读取txt文件-如何在python中读取文件夹中的txt文件列表

    注意:我在答案的最后写了这些函数,所以请随意跳转到那个 – 但是为了更好地理解,我仍然希望逐个部分地运行代码. 将用于解释的示例方案 假设您在此文件夹中有12个名为test的文件,其中10个是.txt ...

  8. python怎么读文件内容-Python读取文件内容为字符串的方法(多种方法详解)

    以下笔记是我在 xue.cn 学习群之数据分析小组所整理分享的心得.相关背景是:我选择中文词频统计案例作为考察大家python基础功掌握程度. 以小见大,下面是2个小技能的具体实战: 如何灵活地处理文 ...

  9. python中读取文件内容-Python读取文件内容与存储

    Python读取与存储文件内容 一..csv文件 读取: importpandas as pd souce_data= pd.read_csv(File_Path) 其中File_path是文件的路径 ...

最新文章

  1. 亚马逊瞄准大数据 欲在汽车行业抢占一席之地
  2. ylbtech-LanguageSamples-UserConversions(用户定义的转换)
  3. c/c++中extern的作用
  4. android 缩略图uri_课题_android系统通过图片绝对路径获取URI的三种方法
  5. [转] c#中 多线程访问winform控件
  6. 华为mate9云闪付功能_华为手机日常使用技巧
  7. 《天天数学》连载42:二月十一日
  8. 【转】NodeJS教程--基于ExpressJS框架的文件上传
  9. ERP项目管理的关键控制点
  10. 如何彻底删除或卸载迈克菲软件
  11. 怎样用数据分析方法应用KANO模型?
  12. 论合伙企业相对有限责任公司的比较优势
  13. 图像 像素与分辨率的关系
  14. SOFA Weekly | SOFA 社区元旦快乐,MOSN 荣获 2020 中国优秀开源项目
  15. 云原生不可变基础设施
  16. 大数据预处理之数据集成
  17. 2012年“Openstack中国行”活动总结与回顾
  18. UVa 1620 Lazy Susan(懒惰的苏珊)
  19. IO有Buffered IO 和 Direct IO
  20. MATLAB:图片缩放

热门文章

  1. 用C++/CLI搭建C++和C#之间的桥梁(一)—— 简介
  2. IOS NSString 操作
  3. 【原创】聊天+传送文件+设置字体及颜色(vs2010+mfc开发)
  4. 数据结构之权值(在吊挂中的实际应用)
  5. 访问一个HTTPS的网站的大致流程
  6. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
  7. 2017暑假 第四周 学习总结(复习)
  8. 建立你的第一个 Git 仓库
  9. Agent admitted failure to sign using the key
  10. Python 中的用户自定义类型