在python中逐行读取大文件
在我们日常工作中,难免会有处理日志文件的时候,当文件小的时候,基本不用当心什么,直接用file.read()或readlines()就可以了,但是如果是将一个10G大小的日志文件读取,即文件大于内存的大小,这么处理就有问题了,会将整个文件加载到内存中从而造成MemoryError … 也就是发生内存溢出。
下面分享几个解决办法:
对file对象进行迭代处理:
with open('file_name', 'r') as file:
for line in file:
print line
优点:
with语句,文件对象在执行完代码块退出后自动关闭文件流,文件读取数据发生异常,进行异常捕获处理
对文件对象进行迭代时,在内部,它会缓冲IO(针对昂贵的IO操作进行优化)和内存管理,所以不必担心大文件。
这才是
Pythonci最完美的方式,既高效又快速
缺点:每一行的数据内容不能大于内存大小,否则就会造成MemoryError
使用yield
正常情况使用上面这种方式就可以了,But,如果遇到整个文件只有一行,而且按照特定的字符进行分割,上面这种方式则不行了,这时候yield就非常有用了。
举个栗子,log的形式是这样子的。
2018-06-18 16:12:08,289 - main - DEBUG - Do something{|}…..
以{|}做为分割符。
def read_line(filename, split, size):
with open(filename, 'r+') as file:
buff = ''
while True:
while split in buff:
position = buff.index(split)
yield buff[:position]
buff = buff[(position +len(split)):]
chunk = file.read(size)
if not chunk:
yield buff
break
buff = buff +chunk
优点:不在限制每行数据的大小,即使整个大文件只有一行。
缺点:速度比上面这种方式要慢。
解析一下:
首先:定义一个缓冲区buff
循环判断,如果split分割符在缓冲区buff,则进行查找分割符出现的位置,并yield回去。
将buff更新,继续第二步
如果split分割符不在缓冲区buff,则read(size)个字符
如果chunk为空,则跳出循环,否则更新buff, 继续第二步
所以我们需要使用那种方式呢,一般来说使用用第一种就可以了。碰到只有一行的数据,而且数据特别大的,就要考虑一下你是不是得罪那个程序员了,故意给你这样一个文件。
在python中逐行读取大文件的更多相关文章
- python中逐行读取文件的最佳方式_Drupal_新浪博客
python中逐行读取文件的最佳方式_Drupal_新浪博客 python中逐行读取文件的最佳方式 (2010-08-18 15:59:28) 转载▼ 标签: python ...
- python chunk 方式读取大文件——本质上还是file read自身支持
参考:https://stackoverflow.com/questions/519633/lazy-method-for-reading-big-file-in-python 最优雅方式: file ...
- 【Python】实现对大文件的增量读取
背景 前段时间在做一个算法测试,需要对源于日志的数据进行分析才能获取到结果:日志文件较大,所以想要获取数据的变化曲线,增量读取是最好的方式. 网上有很多人的技术博客都是写的用for循环readline ...
- PHP 与Python 读取大文件的区别
php读取大文件的方法 <?php function readFile($file) { # 打开文件 $handle = fopen($file, 'rb'); while (feof($ ...
- Python逐块读取大文件行数的代码 - 为程序员服务
Python逐块读取大文件行数的代码 - 为程序员服务 python数文件行数最简单的方法是使用enumerate方法,但是如果文件很大的话,这个方法就有点慢了,我们可以逐块的读取文件的内容,然后按块 ...
- Python读取大文件的"坑“与内存占用检测
python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...
- Python读取大文件(GB)
Python读取大文件(GB) - CSDN博客 https://blog.csdn.net/shudaqi2010/article/details/54017766
- 强悍的Python读取大文件的解决方案
这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件. 1. read() 接口的问题 f =open(filename, ...
- php中读取大文件实现方法详解
php中读取大文件实现方法详解 来源: 时间:2013-09-05 19:27:01 阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解 ...
随机推荐
- 【angular5 项目积累总结】项目公共样式
main.css @font-face { font-family: 'wf_segoe-ui_normal'; src: local('Segoe UI'),url('../fonts/segoe- ...
- Docker学习(二): 镜像的使用与构建
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- 撩课-Python-每天5道面试题-第2天
一. 简述编程过程中, 注释的作用? (1) 方便开发人员自己理清楚代码思路 因为开发人员在拿到一个需求时, 首先应该思考的是如何将需求问题, 分解成具体的实施步骤; 第一步干啥, 第二步干啥, 第三 ...
- Web安全相关(四):过多发布(Over Posting)
简介 过多发布的内容相对比较简单,因此,我只打算把原文中的一些关键信息翻译一下.原文链接如下: http://www.asp.net/mvc/overview/getting-started/gett ...
- CentOS-Linux系统下安装MySQL
一.mysql的安装 Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够 ...
- Angular中父子组件双向绑定传值
下面为大家展示一个较为简单的ng父子组件双向绑定传值,下面是父组件页面 这个页面的大概功能就是父组件(红色)通过输入框输入内容反映到子组件上进行展示,并且进行了投影, 子组件(橙黄色)通过Input输 ...
- WinFrom饼形图
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 01Jenkins环境准备
01.硬件环境 Linux 64位(windows环境类似) 02.安装JDK a) 标题链接到Oracle官网下载jdk-8u144-linux-x64.rpm b) 将jdk拷贝到Linux的/t ...
- IDEA 的缓存问题
当IDEA还是使用以前的配置时,大概率是缓存问题,查看target,里面的内容就是编译好的东西,问题都是出自这里.
- method invocation
package method.invocation; public class MethodInvocation { public static void main(String[] args) { ...