Python 如何处理大文件的读取

Python 如何处理大文件的读取

在日常的开发工作中,我们经常会遇到处理大文件的需求。无论是读取日志文件、处理数据集,还是分析超大文本文件,大文件操作都是一个非常常见的挑战。尤其是在内存有限的环境中,直接将整个文件加载到内存中可能导致内存耗尽,因此我们需要采取更为高效的策略。

本文将详细介绍如何使用 Python 处理大文件的读取,介绍几种常用的技术,包括逐行读取、块读取、使用生成器以及在处理二进制文件时的注意事项。通过这些方法,我们可以高效地处理超过内存容量的文件。

在这里插入图片描述

一、常见的文件读取方式

Python 提供了多种读取文件的方法。在处理较小文件时,我们可以直接使用 read() 一次性读取整个文件到内存中。但当文件非常大时,这种方法显然不可行。为了应对大文件,通常有以下几种方式来读取文件内容:

  1. 逐行读取:逐行读取文件可以节省内存,因为只会将当前行加载到内存。
  2. 分块读取:将文件内容按块读取,每次只读取固定大小的数据。
  3. 生成器:通过生成器惰性加载数据,只在需要时生成数据,避免一次性加载全部数据。

接下来我们将详细介绍这些方法。

二、逐行读取文件

逐行读取文件是处理大文件最常用的方法之一,适用于文本文件。当我们只需处理每一行的数据时,逐行读取不仅节省了内存,还非常直观易懂。

2.1 使用 for 循环逐行读取

Python 提供了一种简单且高效的方式来逐行读取文件内容,即直接使用 for 循环:

with open('large_file.txt', 'r') as file:for line in file:# 对每行数据进行处理print(line.strip())

在这个例子中,for 循环会自动逐行读取文件,strip() 方法用于去除每行末尾的换行符。如果文件非常大,使用这种方法可以避免将整个文件加载到内存中,因为每次只会处理当前行的数据。

2.2 使用 readline() 方法

如果我们想更加明确地控制逐行读取,可以使用 readline() 方法:

with open('large_file.txt', 'r') as file:line = file.readline()while line:# 处理当前行print(line.strip())line = file.readline()  # 读取下一行

这种方法手动调用 readline() 来读取每行数据,当文件读取完毕时,readline() 返回空字符串 '',因此我们可以通过 while 循环来逐行读取文件内容。

2.3 使用 readlines() 方法(不推荐)

虽然 readlines() 方法可以一次性将文件中的每一行读取到一个列表中,但这并不适合处理大文件。readlines() 会将文件的每一行都加载到内存中,若文件非常大,则容易导致内存不足。除非文件较小,否则不建议使用这种方式处理大文件。

三、分块读取文件

除了逐行读取,另一种常用的方法是按块读取文件,即每次读取固定大小的数据块。这种方法在需要处理二进制文件或读取固定字节长度的数据时非常有用。

3.1 使用 read(size) 方法按块读取

read(size) 方法允许我们指定每次读取的字节数。这种方法特别适用于处理二进制文件或按固定大小进行处理的场景。

chunk_size = 1024  # 每次读取 1 KB 数据
with open('large_file.txt', 'r') as file:chunk = file.read(chunk_size)while chunk:# 处理数据块print(chunk)chunk = file.read(chunk_size)  # 继续读取下一块数据

在这个例子中,chunk_size 定义了每次读取的字节数。对于文本文件,1 KB 是一个合适的块大小,但你可以根据需求调整这个值。如果你处理的是二进制文件,可以使用 rb 模式打开文件。

3.2 使用 iter() 进行分块读取

Python 的内置 iter() 函数可以将文件对象转化为一个迭代器。我们可以通过指定一个固定大小的读取函数来实现分块读取:

def read_in_chunks(file_object, chunk_size=1024):"""生成器函数,按块读取文件"""while True:data = file_object.read(chunk_size)if not data:breakyield datawith open('large_file.txt', 'r') as file:for chunk in read_in_chunks(file):# 处理每块数据print(chunk)

这个方法通过生成器实现了按块读取的惰性加载,当文件非常大时也能轻松处理。

四、使用生成器处理大文件

生成器是一种非常强大的工具,适合处理大文件或大量数据时使用。生成器可以像列表一样遍历,但不同于列表的是,生成器只在需要时生成数据,因而非常节省内存。

4.1 基本生成器示例

我们可以定义一个生成器函数,用它来逐行读取大文件:

def file_line_generator(file_name):with open(file_name, 'r') as file:for line in file:yield line.strip()# 使用生成器逐行处理文件
for line in file_line_generator('large_file.txt'):print(line)

这个生成器会逐行读取文件,并通过 yield 将每一行返回给调用方。在处理大文件时,生成器的优势在于不会将整个文件加载到内存中,而是按需生成数据。

五、读取二进制文件

在处理图像、音频等非文本文件时,我们需要以二进制模式打开文件。Python 提供了 rb 模式(read binary)来处理二进制文件。

5.1 读取二进制文件

读取二进制文件时,可以按块读取,这样可以有效避免内存占用过大。

chunk_size = 1024  # 读取 1 KB 大小的块
with open('large_image.jpg', 'rb') as file:chunk = file.read(chunk_size)while chunk:# 处理二进制数据块print(chunk)chunk = file.read(chunk_size)

在这个例子中,我们使用 rb 模式打开文件,并按 1 KB 的块大小读取文件内容。这种方法适合处理任何类型的二进制文件,如图像、音频文件等。

六、使用内存映射文件(mmap)

对于特别大的文件,可以使用 Python 的 mmap 模块,该模块允许我们将文件的一部分映射到内存中,从而不必一次性加载整个文件。

6.1 使用 mmap 模块

内存映射文件是一种高效的文件处理方式,适用于需要频繁随机访问大文件的场景。

import mmapwith open('large_file.txt', 'r+b') as f:# 将文件映射到内存with mmap.mmap(f.fileno(), 0) as mm:# 读取第一个 100 字节print(mm[:100].decode('utf-8'))# 查找文件中某个字串的位置print(mm.find(b'Python'))

在这个例子中,我们将整个文件映射到内存,并可以像操作内存中的字节序列一样操作文件内容。mmap 非常适合处理需要随机读取或写入大文件的场景。

七、处理大文件的注意事项

在处理大文件时,除了选择合适的读取方法,还有一些额外的注意事项:

  1. 选择合适的块大小:按块读取时,块大小的选择很重要。块太大可能导致内存占用过高,块太小可能增加 I/O 操作的频率,导致性能下降。根据文件类型和系统资源调整合适的块大小。

  2. 避免一次性读取大文件:无论是读取文本还是二进制文件,避免一次性读取整个文件到内存中,尤其是文件非常大时。可以选择逐行读取或分块读取。

  3. 使用生成器:生成器非常适合处理大文件或需要延迟加载的数据,因为它不会一次性加载全部数据,而是按需生成数据,减少内存消耗。

  4. 优化 I/O 性能:在处理大文件时,文件 I/O 操作可能成为瓶颈。可以通过合理的缓存、减少 I/O 操作次数来提升性能。例如,按块读取可以有效减少磁盘 I/O 频率。

八、总结

本文介绍了多种在 Python 中处理大文件的技巧和方法,包括逐行读取、按块读取、使用生成器以及

处理二进制文件的方法。通过合理选择合适的文件读取方式,我们可以高效处理超出内存限制的大文件。

处理大文件的核心思想是避免将整个文件一次性加载到内存中,而是通过逐步读取、分块处理等技术来降低内存消耗。这些方法在处理大规模数据集、日志文件或二进制文件时非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/431186.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker配置代理解决pull超时问题

操作系统: CentOS Linux 8 Docker版本: 26.1.3 前置:你需拥有🐱 1. 配置 proxy.conf 1.1 创建配置文件目录 创建 docker.service.d,进入到 docker.service.d 中打开 proxy.conf (没有文件打开会自动创建)。 注意:每个人的路径可…

深度学习|误差逆传播:梯度速解

文章目录 引言链式法则误差逆传播加法的逆传播乘法的逆传播逆传播求梯度 SoftmaxWithLoss 层正向传播逆传播代码实现参考 结语 引言 我们知道训练神经网络模型的核心是以损失函数为基准来调整优化网络参数,使得网络的输出尽可能接近真实标签。在神经网络中&#xf…

Vue使用qrcodejs2-fix生成网页二维码

安装qrcodejs2-fix npm install qrcodejs2-fix核心代码 在指定父view中生成一个二维码通过id找到父布局 //通过id找到父布局let codeView document.getElementById("qrcode")new QRCode(codeView, {text: "测试",width: 128,height: 128,colorDark: #00…

Fyne ( go跨平台GUI )中文文档-小部件 (五)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

LeetcodeTop100 刷题总结(二)

LeetCode 热题 100:https://leetcode.cn/studyplan/top-100-liked/ 文章目录 八、二叉树94. 二叉树的中序遍历(递归与非递归)补充:144. 二叉树的前序遍历(递归与非递归)补充:145. 二叉树的后序遍…

移动数组中数字的方法(c语言)

1.移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。 例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。 移动后,一维数组中的内容应为:5,6,7,8…

qm 命令:管理PVE虚拟机

一、命令简介 ​qm​ 是 Proxmox Virtual Environment (PVE) 中用于管理虚拟机的命令行工具。它允许用户创建、启动、停止、删除虚拟机,以及管理虚拟机的配置和状态。 ‍ 介绍 PVE Proxmox Virtual Environment (PVE) 是一个开源的虚拟化管理平台,专…

设计模式 享元模式(Flyweight Pattern)

享元模式 简绍 享元模式(Flyweight Pattern)是一种结构型设计模式,它的目的是通过共享技术来有效地支持大量细粒度的对象。享元模式可以极大地减少内存的使用,从而提高程序的性能。它特别适用于需要创建大量相似对象的场景&#…

QT 数据加密

一.使用环境 应该是通用的,此测试版本为如图 二.使用代码 1. 运行代码 QString data = "123abcAbc.-+";qDebug() << "加密:" << QAESEncryption::encodedText(data, "填入自己秘钥");qDebug() << "解密:" <…

C++STL的Stack的使用:STL栈和队列的使用介绍、leecode---最小栈、nowcoder---栈的压入、弹出序列等的介绍

文章目录 前言一、STL栈和队列的使用二、leetcode---最小栈三、nowcoder---栈的压入、弹出序列四、逆波兰表达式求值总结 前言 CSTL的Stack的使用&#xff1a;STL栈和队列的使用介绍、leecode—最小栈、nowcoder—栈的压入、弹出序列等的介绍 一、STL栈和队列的使用 #include …

服务器安装pytorch_geometric torch_scatter踩坑记录

conda create -n pyg python3.8.12 pip install torch1.13.0安装的版本如下 pip install torch-scatter pip install torch-sparse pip install torch-cluster pip install torch-spline-conv pip install torch-geometric2.2.0 pip install ipykernel python -m ipykernel i…

Adobe Illustrator吸管工具提取的颜色与原色之间存在色差

问题原因&#xff1a; 被提取颜色的对象是外部链接图片&#xff0c;对其提取的颜色会与AI中看到的颜色不同 如下图所示&#xff0c;中间的矩形与外部矩形的内部颜色存在色差 解决办法&#xff1a; 方法一&#xff1a;将该外部图片利用屏幕截图的形式&#xff0c;粘贴到AI中。…

2.以太网

局域网 局域网: Local Area Networks (LAN) 网络大小分类 局域网园区网(可以理解为企业网)城域网 广域网是一个网络连接的技术&#xff0c;并非多大范围的网络 网关 为局域网内的用户提供了一扇门&#xff0c;通过网关可以访问到别的网络。这个门&#xff0c;就叫网关 以…

部标(JT/T1078)流媒体对接说明

1.前言 最近在配合客户开发流媒体相关的服务的时候&#xff0c;整理了一些对接过程资料&#xff0c;这里做个分享与记录。流媒体的对接主要牵扯到4个方面&#xff1a; &#xff08;1&#xff09;平台端&#xff1a;业务端系统&#xff0c;包含前端呈现界面。 &#xff08;2&a…

物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——STM32代码实现篇

STM32代码实现 开启本章节需要完成下方的前置任务&#xff1a; 点击跳转&#xff1a; 物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 目标 1.连接OneNET&#xff1a;STM32使用串口与ESP8266/01s连接发送…

Linux网络命令:用于请求和配置网络地址的命令dhclient详解

目录 一、概述 二、功能描述 三、基本使用 1. 命令格式 2. 常用选项 3. 获取帮助 ​编辑 4. 基本操作 四、工作原理 1. 发送DHCP请求 2. 接收DHCP响应 3. 请求IP地址 4. 确认IP地址 5. 配置网络接口 五、功能特点 六、配置文件 七、常用命令和示例 1、启动…

QT客户端发送HTTP请求此时服务器到底收到了哪些数据?

一个Http请求包括 请求行 请求头 空行 请求体 下面是示例&#xff1a; 1,2,3,4分别代表上面的四个部分&#xff0c;我只是做了一些解析&#xff0c;具体可以结合代码 1. post / HTTP/1.1 2.GET请求头包括Host(主机名),user-agent&#xff08;客户端标识符&#xff09;&am…

SiMBA:基于FFT变换和Mamba的图像分类模型算法解析

目录 1 算法原理1 EinFFT&#xff1a;1.1 频谱变换1.2 频域通道混频 & 频谱门控网络1.3 逆频谱变换 2 整体计算公式3 SiMBA&#xff1a;4 小结 2 代码大致逻辑EinFFT模块MambaBlock模块MambaLayer模块PVT2FFN和FFN模块ClassBlock和Block_mamba模块DownSamples模块Stem模块定…

统信服务器操作系统【targetcli部署】

targetcli部署方案 文章目录 功能概述功能介绍1.安装targetcli2.targetcli语法及参数说明3.示例1. 配置2.访问功能概述 SCSI 即小型计算机系统接口(Small Computer System Interface;简写:SCSI) iSCSI,internet SCSI 网络磁盘 ,提供一对一的网络存储, 主机A 提供xx存储设…

gitlab 的CI/CD (二)

前言 上文完成了gitlab-runner的基础配置及将gitlab的制品上传至软件包库&#xff08;产品库&#xff09;的脚本编写&#xff1b; 本文实现gitlab的ci/cd对远程服务器的操作&#xff1b; 介绍 要让Gitlab Runner部署到远程机器&#xff0c;远程机器必须信任gitlab runner账…