如何使用Python读取大文件

如何使用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进行大文件读取时,应该让系统来处理,使用最简单的方式,交给解释器,就管好自己的工作就行了。同时根据不同的需求可以选择不同的读取参数进一步获得更高的性能。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119688.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu安装python3及PiP[通俗易懂]

    Ubuntu安装python3及PiP[通俗易懂]Ubuntu自带python2.7,而大多数平台需要python3.切记不要卸载python2.7卸载后只能重做系统。1.安装python1.可以使用anaconda,创建新环境,在创建环境时需要自己指定一个python版本,指定好后它会去下载,在创建环境时condacreate–name******python=***例如我在这里condacreate–nameyolo4python=3.6.9conda会在创建这个环境里安装好python=3.6.9如果pytho

    2022年6月23日
    47
  • xshell7安装步骤_快影下载安装

    xshell7安装步骤_快影下载安装文章目录第一部分下载第一步去官方下载界面第二步填写正确的手机号和密码,之后会有一个下载链接第二部分安装过程第一步双击exe文件,进入安装界面第二步接受统一许可证书第三步选择安装的路径第四步随便选一个图面的目录第五步进行安装界面,等待安全完成第三部分设置ssh配置连接第一步设置名称、主机、端口第二步设置链接方式,我选的账号和密码第三步选择接受密钥第四步成功链接主机摘抄第一部分下载第一步去官方下载界面https://www.xshellcn.com/xiazai.html

    2022年9月9日
    0
  • LoRaWAN地区参数更新至版本B,新增印度865频段「建议收藏」

    LoRaWAN地区参数更新至版本B,新增印度865频段「建议收藏」LoRaWAN地区参数更新至版本B,新增了印度865频段。这为塔塔通讯近期宣布的20万传感器和基站节点建设计划进行了规范铺路。

    2022年10月21日
    0
  • Apache配置+php配置

    Apache配置+php配置一、apache配置首先下载apache安装包,下载地址:http://httpd.apache.org/download.cgi我的是win7系统,所以下载windows的安装包,点击我圈出的地方然后点击ApacheHaus根据自己的电脑选择64位还是32的安装包,进行下载然后解压文件,我解压到E:\Apache\Apache24然后打开文件夹找到conf文件夹…

    2022年7月14日
    12
  • pythonidle安装教程(python命令行安装库)

    首先,IDLE是一款免费的软件,可以直接去python的官网下载,在官网找到相应自己电脑的配置的一类之后选择“DownloadWindowsx86-64executableinstaller”这个下载就可以了。下载完成后打开安装包,1.记得勾选上“apppython3.7toPATH”这一项。然后点击next2.这一步没啥选的直接点击next3.在这一步…

    2022年4月15日
    248
  • jsp和servlet区别

    jsp和servlet区别基本介绍Servlet:Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。Servlet是位于Web服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该…

    2022年6月29日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号