用Python读取大文件(上)

【Python】读取大文件 要理解Python中如何高效读取大文件,我们必须首先从最底层的存储机制和操作系统如何管理文件I/O开始。这不仅是理解上层Python代码行为的基础,更是优化策略的根本所在。硬盘,作为数据持久化存储的核心介质,其物理结构和工作方式直接决定了文件I/O的效率。 对I/O性能的影响:因此,为了高效读取大文件,我们应尽量减少寻道次数和旋转延迟,即尽可能进行顺序读写和大块读写。操作系统管理文件的方式是理解其I/O机制的关键。inode (索引节点):在类Unix文件系统中,每个文件(或目录)都有一个唯一的inode。 阅读详情



通常我们在读取文件的时候,会用到read(), readline(), readlines()。 通常可能会有这样的用法:


def test1():
    with open("/tmp/test.log", "r") as f:
        print f.read()

或者


def test2():
    f = open("/tmp/test.log", "r")
    for line in f.readlines():
        print line
    f.close()


read ()的方法是一次性把文件的内容以字符串的方式读到内存, 放到一个字符串变量中


readlines()的方法是一次性读取所有内容, 并按行生成一个list 


因为read()和readlines()是一次性把文件加载到内存, 如果文件较大, 甚至比内存的大小还大, 内存就会爆掉。 所以,这两种方法只适合读取小的文件。 


实际工作中,会碰到读取10几G的大文件的需求, 比如说日志文件。 这时候就要用的新的读取文件的方法。 这里提供两种方法, 有简单,有复杂,但基本原理都是一样的。 就是利用到生成器generator。 


方法一:

将文件切分成小段,每次处理完小段内容后,释放内存

这里会使用yield生成自定义可迭代对象, 即generator, 每一个带有yield的函数就是一个generator。 


def read_in_block(file_path):
    BLOCK_SIZE = 1024
    with open(file_path, "r") as f:
        while True:
            block = f.read(BLOCK_SIZE)  # 每次读取固定长度到内存缓冲区
            if block:
                yield block
            else:
                return  # 如果读取到文件末尾,则退出


def test3():
    file_path = "/tmp/test.log"
    for block in read_in_block(file_path):
        print block


方法二:

利用open(“”, “”)系统自带方法生成的迭代对象

def test4():
    with open("/tmp/test.log") as f:
        for line in f:
            print line 
 

for line in f 这种用法是把文件对象f当作迭代对象, 系统将自动处理IO缓冲和内存管理, 这种方法是更加pythonic的方法。 比较简洁。 



以上代码均在python2.7环境调试通过。 


本文大略讲解了几种处理文件的方法, 并介绍了大文件的正确打开‘姿势’。 这里提到了几个概念: 分别是生成器,迭代器, 文件对象。 你可能会对这些概念比较陌生, 没关系, 我会在下篇再深入解释这些。 


转载请注明来自: http://blog.youkuaiyun.com/hackstoic/article/details/49804655 , 作者hackstoic


----------------------上篇完-------------------------------


【参考文献】

1.  http://chenqx.github.io/2014/10/29/Python-fastest-way-to-read-a-large-file/

2.  http://www.zhidaow.com/post/python-read-big-file

3.  http://pyzh.readthedocs.org/en/latest/the-python-yield-keyword-explained.html

4.  https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/#ibm-pcon

对于上亿数据使用python进行分块处理 将自己想要处理的文档的名字直接粘贴到代码中,点击运行即可出现分块处理结果。 立即下载

相关推荐

Python多进程分块读取超大文件的方法

主要介绍了Python多进程分块读取超大文件的方法,涉及Python多进程操作与文件分块读取的相关技巧,需要的朋友可以参考下

使用python读取大文件

使用python读取大文件

IT之一小佬的博客 7166

《软件工程——实践者的研究方法》重难点复习笔记(第八章——理解需求)

8项需求工程任务 inception 开始 8.1.1 identify stakeholders 定义:从软件开发中收益 例如:市场人员、销售经理、顾客、顾问、维护团队等(P139) 8.1.2 这个阶段的问题是context-free的。有三套(P140) 8.1.3 提到NFR(nonfunctional requirement)和QFD(quality

whooiif的博客 1814

Python中如何处理大文件读写?

在上面的代码中,我们打开文件并使用二进制模式('rb')进行读取。在上面的代码中,我们定义了一个read_file_line_by_line()生成器函数,它接受一个文件路径作为参数,并逐行读取文件内容。在上面的代码中,我们打开名为large_file.txt的文件,并使用while循环逐行读取文件内容。在处理大文件时,我们可以使用生成器来逐行或逐块读取文件内容,以减少内存占用。需要注意的是,在使用多线程或多进程处理大文件时,我们需要注意线程或进程之间的数据同步和通信问题,以避免数据竞争和一致性问题。

ElvaRaleign的博客 840

3D识别建模 — 基于ReconstructMe和EAGLE EYES SCANNER的实现

3D实体识别建模,作为3D打印反向工程的一个重要环节,今天就让我们利用ReconstructMe和EAGLE EYES SCANNER来了解一下。 第一步、软件和硬件准备就绪 ReconstructMe下载并安装 http://reconstructme.net/?wpdmdl=160 EAGLE EYES SCANNER直接将相应USB插入电脑接口即OK,之后在    中点击搜索“设备管理...

qq_40013290的博客 881

linux操作系统使用以太网连接ubuntu,设置固定ipv4

首先,您需要确定要配置的网络接口。可以使用ifconfig -a或ip addr命令来列出当前系统上的所有网络接口及其相关信息。找到您要配置的网络接口名称,例如eth0、ens33或enp0s3;保存并关闭文件后,您需要重启网络服务以使更改生效。在linux操作系统中,要使用交换机连接以太网可以直接使用交互界面;如果你的操作系统没有交互界面,你可以使用命令方式配置;点击ipv4,方式为手动,可以设置ip和子网了;开头,后接网络接口名称。第三步:点击有线最右边圆形控件;第二步:点击有线设置;

2301_79311842的博客 2404

学会python——读取大文本文件(python实例六)

通过控制每次的输出来展示文件内容,防止过量读取导致的卡顿。同时还可以输出换行和空格,以此来检验源文本文件的格式问题。

LNN0212的博客 830

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

xu_white的博客 7583

Python读取大型数据文件的6种方式汇总

在这个示例中,我们使用 read_csv 函数读取一个名为 large_data.csv 的 CSV 文件,并将其转换为 Pandas DataFrame。Pandas 是 Python 中最流行的数据处理库之一,它提供了一种称为 read_csv 的函数,可以读取大型 CSV 文件并将其转换为 Pandas DataFrame。在这个示例中,我们使用 dask.dataframe 函数读取一个名为 large_data.csv 的 CSV 文件,并将其转换为 Dask DataFrame。

chinaherolts2008的博客 1638

自动批量安装加载cran, bioconductor和github三个平台的所有的R包

自动批量安装加载cran, bioconductor和github三个平台的所有的R包

qq_40073899的博客 561

LangChain从入门到精通最全教程

LangChain是一个用于构建基于大语言模型(LLM数据感知:连接外部数据源(文档、API等)智能代理:通过工具调用实现自主决策模块化设计:支持链式调用、记忆管理、提示词工程等from langchain . llms import BaseLLM class CustomLLM(BaseLLM) : def _call(self , prompt : str , ** kwargs) - > str : return f"自定义响应: {

Cachel Wood的博客 1409

如何使用Python读取超大文本文件

Python是一种开放源代码的动态类型化和解释型编程语言。读取和写入文件是编程的组成部分。在Python中, 使用readlines()方法。 readlines()方法返回一个列表, 其中列表的每个项目都是文件中的完整句子。当文件较小时, 此方法很有用。由于readlines()方法将每行追加到列表中, 然后返回整个列表, 因此如果文件的大小非常大(以GB为单位), 则将非常耗时。同样, 该列表将占用大量内存, 如果没有足够的内存, 则可能导致内存泄漏。

xieshen86的专栏 3987

YOLOv11知识蒸馏,实现无损涨点,包含逻辑蒸馏和特征蒸馏中的不同蒸馏方法,适用专栏内的所有模型

知识蒸馏(Knowledge Distillation)是由 Hinton 等人在 2015 年提出来的,主要是用一个复杂的教师模型去指导一个简单的学生模型训练,这样能让学生模型在保持高精度的同时,还能减少计算量。本文便是讲解如何针对的原始模型以及改进后的模型进行知识蒸馏,轻松实现无损涨点。知识蒸馏的核心在于利用已训练好的复杂模型(教师模型)去指导一个更简单的模型(学生模型)进行训练,以此让学生模型在保留较高精度的同时,降低计算成本。特征蒸馏(Feature Distillation)是知识蒸馏的一种形式,

Limiiiing的博客 4959

Python 如何处理大文件的读取

本文介绍了多种在 Python 中处理大文件的技巧和方法,包括逐行读取、按块读取、使用生成器以及处理二进制文件的方法。通过合理选择合适的文件读取方式,我们可以高效处理超出内存限制的大文件。处理大文件的核心思想是避免将整个文件一次性加载到内存中,而是通过逐步读取、分块处理等技术来降低内存消耗。这些方法在处理大规模数据集、日志文件或二进制文件时非常有用。

chusheng1840的博客 2896

【学习系列】SAP RAP 4:通过注解来完成一些常规需求

本文介绍了RAP应用中常用注解的实现方式,包括搜索帮助、文本描述绑定、联动搜索、字段控制等功能。通过@Consumption、@UI等注解可以实现搜索帮助定义、多字段联动、必输校验、默认排序和默认值设置。管理字段可通过@Semantics注解自动记录创建/修改信息,长文本使用@UI.multiLineText实现多行显示。这些注解可优化界面交互和数据管理,为后续行为定义功能开发奠定基础。文章结构清晰,针对不同需求提供了具体的实现方案和代码示例。

DeveloperMrMeng的博客 696

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python 读取大文件

python 读取大文件 python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.read() 这种方法读取小文件,即读取大小远远小于内存的文件显然没有什么问题。但是如果是将一个10G大小的日志文件读取,即文件大小大于内存,这么处理就有问题了,会造成MemoryError … 也就是发生内存溢出。 这里发现跟re...

鬼小七的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Python 读取大文件

Python读取文件大小大于内存,这么处理就有问题了,会造成MemoryError … 也就是发生内存溢出。那么改如何避免或者定位呢

未来在这儿的专栏 2794

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

python高效读取大文件_python 如何读取大文件

一般的读取文件的方法:with open(file_path, "r") as f:print f.read()或者with open(file_path,"r") as f:for line in f.readlines():print lineread()是一次性把文件内容以字符串的方式读到内存,放到一个字符串变量中readlines() 是一次性读取所有内容,并按行生成一个list因一次性读...

weixin_39881155的博客 2104

python 读取大文件_python读取大文件

最近在学习python的过程中接触到了python对文件的读取。python读取文件一般情况是利用open()函数以及read()函数来完成:f = open(filename,'r')f.read()这种方法读取小文件,即读取远远大小小于内存的文件显然没有什么问题。但是如果是将一个10G大小的日志文件读取,即文件大于内存的大小,这么处理就有问题了,会造成MemoryError ... 也就是发生...

weixin_39618456的博客 133

python读取大文件太慢_强悍的Python读取大文件的解决方案

Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件。1. read() 接口的问题f = open(filename, 'rb')f.read()我们来读取 1 个 nginx 的日至文件,规模为 3Gb 大小。read() 方法执行的操作...

weixin_39923806的博客 2716

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

背景最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法。准备工作我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: .read()、.readline() 和 .readlin...

weixin_37988176的博客 361

python读取大文件目录_python简单读取大文件的方法

python简单读取大文件的方法更新时间:2016年07月01日 10:42:14 作者:holybin这篇文章主要介绍了python简单读取大文件的方法,通过非常简单的方式实现对GB级别大文件的读取功能,并给出了外文参考站点stackoverflow的参考地址,需要的朋友可以参考下本文实例讲述了python简单读取大文件的方法。分享给大家供大家参考,具体如下:Python读取大文件(GB级别...

weixin_39526185的博客 85

python读取大文件内容_总算发现python如何读取大文件

总算发现python如何读取大文件日期:2019-08-25 12:18:37浏览:332核心提示:在处理大数据时,有可能会碰到好几个G大小的文件。如果通过一些工具(例如:NotePad++)打开它,会发生错误,无法读取任何内容。在处理大数据时,有可能会碰到好几个 G 大小的文件。如果通过一些工具(例如:NotePad++)打开它,会发生错误,无法读取任何内容。那么python如何读取大文件呢?一...

weixin_39656853的博客 351

python 读取大文件优化示例

本文介绍了多种高效读取大文件的方法,包括逐行读取(内存占用O(1))、分块读取(适合超大文件)、内存映射(高性能)和缓冲读取(平衡性能与内存)。针对CSV、JSONLines等结构化数据提供了专用处理方案,并展示了内存高效的单词计数实现。关键优化建议包括:使用生成器、合理设置块大小、进度监控和错误处理。根据文件大小推荐不同方案:小于100MB直接读取,100MB-1GB用逐行读取,大于1GB采用内存映射或分块处理。文末附有完整Python实现代码,包含文件大小检测、多种读取方式和结构化数据处理示例,可有效处

灵光通码的博客 1157

Python3读取大文件的方法

Python3读取大文件的方法1. 方法一:利用yield生成器2. 方法二:利用open()自带方法生成迭代对象,这个是一行一行的读取3. 二者的比较 1. 方法一:利用yield生成器 def readPart(filePath, size=1024, encoding="utf-8"): with open(filePath,"r",encoding=encoding) as f: ...

Jock2018的博客 1万+

Python 中高效读取大文件的完整指南

Python 中高效读取大文件的完整指南

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 2803
上一篇: 业余时间没事做,可以试试这些......
下一篇: 用Python读取大文件(下)
hackstoic
博客等级 码龄11年 50粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值