在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中读取大文件实现方法详解吧,有需要了解 ...
随机推荐
- 迁移SharePoint搜索服务至新的服务器
转自:http://blog.fpweb.net/move-sharepoint-2013-search-components-to-new-server/#.V_w4JZH_6uh In this ...
- PL/SQL:these query result are not updateable,include the ROWID to get updateab -----for update
these query result are not updateable,include the ROWID to get updateab 原因: 其实,选中一个表后,右键,如果选择“query ...
- [javaSE] GUI(鼠标事件)
调用Button对象的addMouseListener方法,参数:MouseListener对象,这个类是个接口,需要实现以下方法 mouseClicked mousePressed mouseRel ...
- centos文件/文件夹操作-检查磁盘、内存、cpu使用情况-vi操作命令
Part1:CentOS文件/文件夹操作 1.新建文件夹 即创建目录 mkdir 文件名 新建一个名为test的文件夹在home下 vi source1 mkdir /home/test 注意:当创建 ...
- JS 浮点数计算
一.从String中解析浮点数 parseFloat(string) 语法说明 parseFloat是个全局函数,不属于任何对象. parseFloat将它的字符串参数解析成为浮点数并返回.如果在解析 ...
- input 输入框限制
只能输入数字和一个小数点 转自: https://www.jianshu.com/p/c26bfb0dfd8d <label> <input id="tranlimit_b ...
- Oracle数据库web维护管理及监控
1.Oracle数据库客户端的种类及现状 目前Oracle数据库维护管理,通常是使用客户端软件:PL/SQL Developer,SQL* Plus,toad,em等进行数据的管理.维 ...
- Q:java中的泛型数组
对于java,其是不支持直接创建泛型数组的.当采用如下的方式去创建一个泛型数组时,其会出现错误,编译无法通过的情况. package other.jdk1_5; /** * 该类用于演示泛型数组的创 ...
- bash shell学习笔记(一)—— 常用命令
一.基本的bash shell命令 1.默认bash shell 提示符是美元符号($); 2.bash手册 使用man命令来访问存储在Linux系统上的手册页面,如: bogon:~ Mac$ ma ...
- CentOS-Linux系统下安装Tomcat
步骤1:解压Tomcat 命令: unzip apache-tomcat-8.5.20.zip 步骤2:将tomcat 移动到“/usr/local/src/java/tomcat8.5”下并重命名 ...