原文地址

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 的使用相关推荐

  1. python读取超大文件 Python读取大文件(GB)

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

  2. python读取大文件-python如何读取大文件以及分析时的性能优化小技巧

    在二代.三代测序背景下,分析人员难免会遇到解析超过1G.或者10G以上的文件.这里将给大家简单介绍下如何用python读取大文件,并给大家提两个优化代码的小建议. 首先,python 读取GB级大文件 ...

  3. python读取大文件-使用Python读取大文件的方法

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

  4. PHP 与Python 读取大文件的区别

    php读取大文件的方法 <?php function readFile($file) {# 打开文件$handle = fopen($file, 'rb');while (feof($handl ...

  5. 使用python读取大文件

    读取文件时,如果文件过大,则一次读取全部内容到内存,容易造成内存不足,所以要对大文件进行批量的读取内容. python读取大文件通常两种方法:第一种是利用yield生成器读取:第二种是:利用open( ...

  6. python 读取大文件

    python 读取大文件 python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.read() 这种方法读取小文件,即读取大小 ...

  7. python读取大文件-强悍的Python读取大文件的解决方案

    Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...

  8. python读文件代码-简单了解Python读取大文件代码实例

    这篇文章主要介绍了简单了解Python读取大文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通常对于大文件读取及处理,不可能直接加载到内 ...

  9. python读取大文件性能_强悍的Python读取大文件的解决方案

    Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...

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

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

最新文章

  1. 成功解决ValueError: too many values to unpack (expected 2)
  2. Acwing 135 最大子序和
  3. 面试官: Flink双流JOIN了解吗? 简单说说其实现原理
  4. Cloudera Manager安装之Cloudera Manager 5.3.X安装(三)(tar方式、rpm方式和yum方式)...
  5. Atitit. 真正的全中国文字attilax易语言的特点以及范例
  6. 程序员数学(7)--平面直角坐标系
  7. 常用的并发测试工具及压测方法
  8. 6s英语语法笔记(图片炸了)
  9. [redis]知识回顾之redis主从+哨兵搭建简要记录
  10. python计算整数区间[m、n所有整数之和_Python:就区间正整数内所有素数之和
  11. pyscripter与python的关系_Codecademy Python和Pyscripter提供错误消息
  12. 谷歌等大型科技公司对你了解多深,你想知道吗?
  13. C语言初阶知识点思维导图(超大图片、超级详细版)
  14. 光模块第一节之模块的制作和测试环境搭建
  15. 【STM32】通过RTThread驱动W25QXXX
  16. 猪头三生活平凡的一天
  17. 用Python实现原生爬取某牙直播平台数据
  18. java高并发实际处理简介
  19. EasyNVR运行一段时间后出现停止现象是什么原因?如何解决?
  20. Java、JSP校友录同学录网站

热门文章

  1. 皮尔斯晶体振荡器晶体管接入系数及谐振频率详细推导过程
  2. 利用.htacess来防止恶意登录和SQL注入攻击!
  3. 12306登陆窗体验证码自动识别
  4. Apache安装路径查询
  5. 制造大数据分析软件——制造企业营销管理及分析系统
  6. c++ vector的内存释放
  7. stm32固件库--滴答定时器
  8. msiexec Msi文件在命令行安装的命令帮助内容 来自微软帮助Windows (R) Installer
  9. ASPX+MSSQL注入
  10. 百度音乐API全接口