Python 读取大文件(GB) yield 的使用
原文地址
https://blog.csdn.net/shudaqi2010/article/details/54017766
https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法。
Preliminary
我们谈到“文本处理”时,我们通常是指处理的内容。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) # <do something with line>
Read In Chunks
处理大文件是很容易想到的就是将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。这里用了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) # .read(size) 读取size个字节if not chunk_data:breakyield chunk_data
if __name__ == "__main__":filePath = './path/filename'for chunk in read_in_chunks(filePath):process(chunk) # <do something with chunk>
Using 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>
yield的使用
yield 可用于文件读取。如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用。好的方法是利用固定长度的缓冲区来不断读取文件内容。通过 yield,我们不再需要编写读文件的迭代类,就可以轻松实现文件读取:
def read_file(fpath): BLOCK_SIZE = 1024 with open(fpath, 'rb') as f: while True: block = f.read(BLOCK_SIZE) if block: yield block else: return
Python 读取大文件(GB) yield 的使用相关推荐
- python读取超大文件 Python读取大文件(GB)
最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. 我们谈到&qu ...
- python读取大文件-python如何读取大文件以及分析时的性能优化小技巧
在二代.三代测序背景下,分析人员难免会遇到解析超过1G.或者10G以上的文件.这里将给大家简单介绍下如何用python读取大文件,并给大家提两个优化代码的小建议. 首先,python 读取GB级大文件 ...
- python读取大文件-使用Python读取大文件的方法
背景 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. 准备工作 ...
- PHP 与Python 读取大文件的区别
php读取大文件的方法 <?php function readFile($file) {# 打开文件$handle = fopen($file, 'rb');while (feof($handl ...
- 使用python读取大文件
读取文件时,如果文件过大,则一次读取全部内容到内存,容易造成内存不足,所以要对大文件进行批量的读取内容. python读取大文件通常两种方法:第一种是利用yield生成器读取:第二种是:利用open( ...
- python 读取大文件
python 读取大文件 python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.read() 这种方法读取小文件,即读取大小 ...
- python读取大文件-强悍的Python读取大文件的解决方案
Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...
- python读文件代码-简单了解Python读取大文件代码实例
这篇文章主要介绍了简单了解Python读取大文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通常对于大文件读取及处理,不可能直接加载到内 ...
- python读取大文件性能_强悍的Python读取大文件的解决方案
Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...
- python中0xff_强悍的Python读取大文件的解决方案
这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件. 1. read() 接口的问题 f =open(filename, ...
最新文章
- 成功解决ValueError: too many values to unpack (expected 2)
- Acwing 135 最大子序和
- 面试官: Flink双流JOIN了解吗? 简单说说其实现原理
- Cloudera Manager安装之Cloudera Manager 5.3.X安装(三)(tar方式、rpm方式和yum方式)...
- Atitit. 真正的全中国文字attilax易语言的特点以及范例
- 程序员数学(7)--平面直角坐标系
- 常用的并发测试工具及压测方法
- 6s英语语法笔记(图片炸了)
- [redis]知识回顾之redis主从+哨兵搭建简要记录
- python计算整数区间[m、n所有整数之和_Python:就区间正整数内所有素数之和
- pyscripter与python的关系_Codecademy Python和Pyscripter提供错误消息
- 谷歌等大型科技公司对你了解多深,你想知道吗?
- C语言初阶知识点思维导图(超大图片、超级详细版)
- 光模块第一节之模块的制作和测试环境搭建
- 【STM32】通过RTThread驱动W25QXXX
- 猪头三生活平凡的一天
- 用Python实现原生爬取某牙直播平台数据
- java高并发实际处理简介
- EasyNVR运行一段时间后出现停止现象是什么原因?如何解决?
- Java、JSP校友录同学录网站