如何使用 Python 读取数据量庞大的 excel 文件

使用 pandas.read_excel 读取大文件时,的确会遇到性能瓶颈,特别是对于10万行20列这种规模的 .xlsx 文件,常规的 pandas 方法可能会比较慢。

要提高读取速度,关键是找到更高效的方式处理 Excel 文件,特别是在 Python 的生态圈中,已经有多个技术可以帮助解决这个问题。

一种办法是使用 openpyxl 直接处理 Excel 文件,结合 pandas 来读取数据。这可以让我们在处理数据时获得更大的灵活性,并通过分块读取文件来提高效率。

openpyxl

官网地址:
https://openpyxl.readthedocs.io/en/stable/

另外,还可以选择 pyxlsb 这个库,它可以更快速地处理 .xlsb 格式的文件,比传统的 .xlsx 格式快很多。

pyxlsb

官网地址:https://pypi.org/project/pyxlsb/
如果可能的话,将文件转为 .csv 格式读取也会显著提高性能,因为 CSV 文件是纯文本格式,相较于 .xlsx 的结构化存储,读取会更加高效。

分析 pandas.read_excel 的性能问题

在实际中,pandas.read_excel 本身的性能瓶颈主要来自于两个方面:数据的解析与文件的格式。.xlsx 是一种基于 XML 的文件格式,因此在读取时需要解析 XML,这本身就是一个比较慢的过程。尤其当文件较大时,解析 XML 的时间会大幅增加。

为了解决这个问题,可以考虑以下几种优化策略:

  1. 使用不同的引擎pandas 支持多种 Excel 解析引擎,比如 openpyxlxlrd。根据情况选择合适的引擎,可能会改善读取性能。

  2. 分块读取:可以通过逐步读取文件的方式,避免一次性将整个文件加载到内存中。这可以显著减少内存占用,并提高读取的稳定性。

  3. 选择合适的文件格式:如果文件格式不是必须的,可以将 .xlsx 文件转为 .csv 文件,这样可以使用更高效的读取方法。

优化方案 1:使用 openpyxlpandas

openpyxlpandas 内置支持的引擎之一,但它的读取速度较慢。在这种情况下,可以手动使用 openpyxl 读取数据,然后将其转换为 pandasDataFrame

代码示例
import pandas as pd
from openpyxl import load_workbook# 读取xlsx文件的路径
file_path = "your_large_file.xlsx"# 使用 openpyxl 直接加载工作簿
wb = load_workbook(filename=file_path, read_only=True)
sheet = wb.active# 使用生成器按行读取数据,避免一次性加载所有数据
data = []
for row in sheet.iter_rows(values_only=True):data.append(row)# 转换为 pandas DataFrame
df = pd.DataFrame(data[1:], columns=data[0])# 打印读取的数据
print(df.head())

通过这种方法,我们避免了一次性将整个文件加载到内存中,而是使用了 openpyxliter_rows 方法逐行读取文件内容。这样,即使文件非常大,也能有效减轻内存负担。

优化方案 2:使用 pyxlsb 读取 .xlsb 文件

.xlsb 是二进制的 Excel 文件格式,它比 .xlsx 文件格式更为高效,尤其是在处理大文件时,可以显著减少读取时间。pyxlsb 库是一个专门用于读取 .xlsb 文件的高效库,配合 pandas 可以更快地读取数据。

代码示例
import pandas as pd
from pyxlsb import open_workbook# 将 .xlsx 文件转换为 .xlsb 格式后使用此方法读取
file_path = "your_large_file.xlsb"with open_workbook(file_path) as wb:with wb.get_sheet(1) as sheet:data = []for row in sheet.rows():data.append([item.v for item in row])df = pd.DataFrame(data[1:], columns=data[0])
print(df.head())

使用 pyxlsb 可以有效加快 Excel 文件的读取速度,特别是在处理非常大的文件时,这个方法比 pandas.read_excel 提供的默认引擎快很多。不过需要注意的是,这种方法仅适用于 .xlsb 格式文件。

优化方案 3:使用 dask 分块处理大数据

dask 是一个支持并行计算的 Python 库,它可以用来处理大型数据集。如果我们遇到的数据文件过大,dask 提供了类似 pandas 的 API,但它会将大文件分块处理,避免一次性占用大量内存。

代码示例
import dask.dataframe as dd# 使用 dask 读取大文件
file_path = "your_large_file.xlsx"
df = dd.read_excel(file_path)# 使用 dask 处理数据
print(df.head())

dask 是一个非常强大的工具,它不仅支持分布式计算,还可以在多核环境下加快处理速度。通过将文件拆分成小块并行处理,dask 能够高效地应对大规模数据集的读取和计算。

优化方案 4:将文件转换为 CSV 格式

如果文件的格式不是必须的,那么将 .xlsx 文件转换为 .csv 格式是一种直接且有效的方式。.csv 格式相较于 .xlsx 没有复杂的 XML 结构,因此读取速度会快得多。转换后可以直接使用 pandas.read_csv 来读取数据,速度会比 read_excel 快很多。

代码示例
import pandas as pd# 假设已经将文件转换为 CSV 格式
file_path = "your_large_file.csv"# 使用 pandas 读取 CSV 文件
df = pd.read_csv(file_path)# 打印前几行数据
print(df.head())

通过这种方式,能够显著提高数据读取速度,因为 .csv 格式的文件是纯文本,不需要复杂的解析过程。

其他可能的优化策略

除了前面提到的几种方法,还有一些其他技术可以用来进一步优化 Excel 文件的读取速度:

  1. 并行读取:如果系统支持,可以将 Excel 文件按工作表或其他分块标准进行拆分,使用并行处理技术(如 multiprocessing)同时读取多个小文件。

  2. 数据格式优化:如果文件的数据结构允许,转换为 Parquet 或 HDF5 格式,这些格式在大数据处理方面的性能往往优于 Excel 和 CSV。

  3. 增加内存或硬件支持:在某些极端情况下,硬件资源不足也可能是瓶颈。增加内存或使用更快的硬盘(如 SSD)可以提高整体数据读取的性能。

总结

通过上述几种方法,可以大幅优化使用 Python 读取大型 Excel 文件的性能。openpyxl 适用于灵活处理 .xlsx 文件,pyxlsb 则是处理 .xlsb 文件的利器,而使用 dask 可以分块读取并行处理大数据集。此外,如果可以转换文件格式,使用 .csv 是提升读取速度的有效途径。

不同的方案适用于不同的场景,开发者可以根据具体需求选择最合适的解决方案。例如,当文件格式无法改变时,openpyxl 结合 pandas 是一个相对平衡的选择,而在文件格式灵活的情况下,将 .xlsx 转为 .csv 并使用 pandas.read_csv 则能最大化提高读取性能。

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

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

相关文章

毕业设计项目——基于transformer的中文医疗领域命名实体识别(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 近年来,随着深度学习技术的发展,基于Transformer和BERT的模型在自然语言处理领域取得了显著进展。在中文医疗领域,命名实体识别(Named Entity Recognition, NER)是一项重要任务,旨…

uniapp实战教程:如何封装一个可复用的表单组件

在uniapp开发过程中,表单组件的使用场景非常广泛。为了提高开发效率,我们可以将常用的表单组件进行封装。本文将带你了解如何在uniapp中封装一个表单组件,让你只需要通过属性配置轻松实现各种表单,效果图如下: 一、准备…

如何利用免费音频剪辑软件制作出精彩音频

现在有许多免费的音频剪辑软件可供选择,它们为广大用户提供了丰富的功能和便捷的操作体验,让音频编辑变得更加轻松和有趣。接下来,让我们一起走进这些免费音频剪辑软件的世界,探索它们的独特魅力和强大功能。 1.福昕音频剪辑 链…

【Nacos入门到实战十四】Nacos配置管理:集群部署与高可用策略

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

点云补全 学习笔记

目录 Depth completion with convolutions and vision transformers 依赖项: DCNv2 softpoolnet Depth completion with convolutions and vision transformers Zhang, Y., Guo, X., Poggi, M., Zhu, Z., Huang, G., Mattoccia, S.: Completionformer: Depth co…

力扣10.6

134. 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 …

docker运行arm64架构的镜像、不同平台镜像构建

背景 Docker 允许开发者将应用及其依赖打包成一个轻量级、可移植的容器,实现“一次构建,到处运行”的目标。然而,不同的操作系统和硬件架构对容器镜像有不同的要求。例如,Linux 和 Windows 系统有不同的文件系统和系统调用&#…

【预备理论知识——2】深度学习:线性代数概述

简单地说,机器学习就是做出预测。 线性代数 线性代数是数学的一个分支,主要研究向量空间、线性方程组、矩阵理论、线性变换、特征值和特征向量、内积空间等概念。它是现代数学的基础之一,并且在物理学、工程学、计算机科学、经济学等领域有着…

css3-----2D转换、动画

2D 转换(transform) 转换(transform)是CSS3中具有颠覆性的特征之一,可以实现元素的位移、旋转、缩放等效果 移动:translate旋转:rotate缩放:scale 二维坐标系 2D 转换之移动 trans…

OpenGL笔记十九之相机系统

OpenGL笔记十九之相机系统 —— 2024-10-02 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十九之相机系统1.运行1.1.游戏相机1.2.轨迹球相机 2.游戏相机与轨迹球相机切换3.博主笔记本要运行需要更改的文件更改1:28_OpenGL_CameraSystem/applicat…

C语言文件操作(下)(28)

文章目录 前言一、文件的打开和关闭打开打开模式相对路径和绝对路径 关闭 二、文件操作正确流程三、文件顺序读写函数fopenfclosefputcfgetcfputsfgetsfprintffscanfsprintfsscanffwritefread 四、文件随机读写函数fseekftellrewind 五、文件读取结束时候的判断feofferror具体例…

高级 Java Redis 客户端 有哪些?

高级Java Redis客户端主要包括以下几种: 1. Redisson (https://github.com/redisson/redisson) 特点:Redisson是一个在Redis的基础上实现的Java驻留数据网格(In-Memory Data Grid)。它不仅是一个Redis的J…

4个顶级的大模型推理引擎

LLM 在文本生成应用中表现出色,例如具有高理解度和流畅度的聊天和代码完成模型。然而,它们的庞大规模也给推理带来了挑战。基本推理速度很慢,因为 LLM 会逐个生成文本标记,需要对每个下一个标记进行重复调用。随着输入序列的增长&…

什么是 Tammann temperature

Tammann temperature (Tt_tt​) 是材料科学中一个重要的概念,它通常用于描述材料的热力学特性和相变行为。其定义与玻璃态和晶态材料的内部原子运动相关。Tammann 温度在研究材料的扩散、再结晶、以及玻璃化转变过程中具有重要意义。 1. Tammann 温度的定义 Tamma…

【AIGC】2022-NIPS-视频扩散模型

2022-NIPS-Video Diffusion Models 视频扩散模型摘要1. 引言2. 背景3. 视频扩散模型3.1. 重建引导采样以改进条件生成 4. 实验4.1. 无条件视频建模4.2. 视频预测4.3. 文本条件视频生成4.3.1 视频与图像建模的联合训练4.3.2 无分类器指导的效果4.3.3 更长序列的自回归视频扩展 5…

06.useEffect

在 React 开发中,正确使用 useEffect 钩子对于优化组件性能至关重要。一个常见但容易被忽视的性能问题是在依赖数组中使用对象作为依赖项。这可能导致不必要的效果重新执行,从而影响应用性能。通过优先使用原始值(如字符串、数字)作为依赖项,我们可以显著提高组件的效率。…

【多线程】详解 CAS 机制

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. CAS 是什么1.1 CAS 具体步骤1.2 CAS 伪代码 2. CAS 的应用2.1 实现原子类2.1.1 AtomInteger 类2.1.2 伪代…

word无法复制粘贴

word无法复制粘贴 使用word时复制粘贴报错 如下: 报错:运行时错误‘53’,文件未找到:MathPage.WLL 这是mathtype导致的。 解决方法 1)在mathtype下载目录下找到"\MathType\MathPage\64"下的"mathpa…

Qt开发第一讲

一、Qt项目里面有什么? 对各个文件的解释: Empty.pro文件 QT core gui # 要引入的Qt模块,后面学习到一些内容的时候可能会修改这里 #这个文件相当于Linux里面的makefile文件。makefile其实是一个非常古老的技术了。 #qmake搭配.pr…

C++之模版进阶篇

目录 前言 1.非类型模版参数 2.模版的特化 2.1概念 2.2函数模版特化 2.3 类模板特化 2.3.1 全特化和偏特化 2.3.2类模版特化应用实例 3.模版分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板总结 结束语 前言 在模版初阶我们学习了函数模版和类…