首页 > 编程问答 >使用 Python 读取 .xlsx 文件的最快方法

使用 Python 读取 .xlsx 文件的最快方法

时间:2024-07-31 16:22:38浏览次数:13  
标签:python mysql pandas openpyxl xlrd

我正在尝试使用 Python 将 .xlsx 文件中的数据读入 MySQL 数据库。

这是我的代码:

wb = openpyxl.load_workbook(filename="file", read_only=True)
ws = wb['My Worksheet']

conn = MySQLdb.connect()
cursor = conn.cursor()

cursor.execute("SET autocommit = 0")

for row in ws.iter_rows(row_offset=1):
     sql_row = # data i need
     cursor.execute("INSERT sql_row")

conn.commit() 

不幸的是, openpyxl ws.iter_rows() 速度非常慢。我已经使用 xlrd pandas 模块尝试了类似的方法。还是很慢。有什么想法吗?


好的,以下是使用 Python 加快 .xlsx 文件读取速度的一些方法:

1. 使用 openpyxl 的只读模式和值预加载:

  • 已经在使用 read_only=True ,这很棒。
  • 此外,使用 data_values=True 预加载单元格值可以提高性能:

    python wb = openpyxl.load_workbook(filename="file", read_only=True, data_only=True)

2. 批量插入 MySQL:

  • 与其一次插入一行,不如将多行数据收集到一个列表中,并使用 executemany() 执行批量插入。

    ```python sql = "INSERT INTO your_table (column1, column2, ...) VALUES (%s, %s, ...)" values = []

    for row in ws.iter_rows(min_row=2, values_only=True): sql_row = list(row) # 假设需要所有列 values.append(sql_row)

    cursor.executemany(sql, values) conn.commit() ```

3. 尝试其他库:

  • XlsxWriter 读取: 虽然主要用于写入,但 XlsxWriter 也可以读取文件,并且在某些情况下速度更快。

    ```python import xlsxwriter

    workbook = xlsxwriter.Workbook('file.xlsx') worksheet = workbook.add_worksheet()

    for row_num, row_data in enumerate(worksheet.iter_rows()): # 处理 row_data ```

  • csv 模块(如果适用): 如果可以将 .xlsx 文件转换为 .csv ,则使用内置的 csv 模块通常是最快的选择。

4. 优化 MySQL 设置:

  • 增加 innodb_buffer_pool_size 这将为 MySQL 的缓冲池分配更多内存,从而可以更快地进行插入操作。
  • 禁用索引(临时): 如果要加载大量数据,请考虑在加载过程中临时禁用索引,然后在加载完成后重新启用它们。

5. 考虑其他工具:

  • 对于非常大的数据集,使用专门的 ETL(提取、转换、加载)工具(如 Apache Kafka、Apache Nifi 或 Python 的 petl 库)可能是更好的选择。

代码示例(结合最佳实践):

import openpyxl
import MySQLdb

wb = openpyxl.load_workbook(filename="file.xlsx", read_only=True, data_only=True)
ws = wb['My Worksheet']

conn = MySQLdb.connect()
cursor = conn.cursor()

sql = "INSERT INTO your_table (column1, column2, ...) VALUES (%s, %s, ...)"
values = []

for row in ws.iter_rows(min_row=2, values_only=True):
    sql_row = list(row)
    values.append(sql_row)

cursor.executemany(sql, values)
conn.commit() 

请记住根据的特定需求和数据大小测试不同的方法,以确定哪种方法最有效。

标签:python,mysql,pandas,openpyxl,xlrd
From: 44765252

相关文章

  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-60 - 判断元素是否显示 - 下篇
    1.简介有些页面元素的生命周期如同流星一闪,昙花一现。我们也不知道这个元素在没在页面中出现过,为了捕获这一美好瞬间,让其成为永恒。我们就来判断元素是否显示出现过。在操作元素之前,可以先判断元素的状态。判断元素操作状态也可以用于断言。2.常用的元素判断方法2.1page对象调......
  • 是否有可能在Python中获取客户端计算机的位置
    我想编写一个程序,用python查找客户端计算机的位置。不过,我不介意它的格式如何。我到处尝试过一些东西,但老实说,我对这类事情了解不多,所以我真的不知道从哪里开始。|||我想简单地运行该程序,并将运行该程序的客户端计算机的位置写入控制台。Iwouldliketosimplyrunt......
  • Python:使用 Selenium WebDriver 无法在客户端打开浏览器
    我使用SeleniumWebDriver开发了一个应用程序来打开一些页面。它在本地工作得很好,但我还需要在客户端启动浏览器。我使用Apache2underUbuntu18部署了应用程序。driver=webdriver.Chrome(executable_path="chromedriver",chrome_options=ch......
  • Python:使用默认模块在python中读取excel
    我有Python2.6.6版本,但无法安装pandas、xlrd、xlwt等新模块。我想使用Python读取Excel。是否可以使用Python中存在的默认模块读取Excel。抱歉,不能使用Python2.6.6的默认模块读取Excel文件。Python没有内置的功能来处理Excel文件。使用外部库(如提......
  • 【Python】从0开始写脚本、Selenium详细教程、附源码案例(保姆篇)
    文章目录准备工作安装selenium配置浏览器驱动脚本测试什么是Selenium?Selenium功能示例(可直接拷贝执行)编写一个简单的Python脚本来使用Selenium打开一个网页,并获取网页的标题下面是一个示例,自动打开csdn并进行搜索Selenium使用Selenium元素定位文本输入、清除与提交......
  • Python控制台输出的华丽变身:色彩与风格的深度探索
    一、文章摘要本文深入探讨了Python标准输出中字体颜色的设置方法,特别是通过ANSI转义序列实现的文本样式控制。文章详细解析了ANSI转义序列的组成、各个颜色代码的含义,以及如何在Python中使用这些代码来改变终端输出的字体颜色、背景色、高光、加粗等样式。通过丰富的案例代码,......
  • 二十五、【机器学习】-【Python手搓3层神经网络】:从零构建深度学习模型的实战指南
    目录一、序章:为什么你需要掌握手搓神经网络二、基础篇:神经网络基础知识回顾三、实战配置:搭建3层神经网络的步骤与技巧(一)、__init__ 方法初始化神经网络(二)、train 方法实现了前向传播和反向传播(三)、query 方法(四)、全部代码四、总结一、序章:为什么你需要掌握手......
  • 在Python中将简单的字典导出到Excel文件中
    我是Python新手。我有一个简单的字典,其键和值如下dict1={"numberofstoragearrays":45,"numberofports":2390,......}我需要将它们放入Excel表中,如下numberofstoragearrays45numberofports2390我有一个非常大的字典。importpandasasp......
  • 将 python 脚本作为 AWS 胶水服务作业运行
    我有一个使用本地路径在本地运行的python脚本,但我需要复制此python脚本并将其作为AWS胶水服务作业运行并将输出保存在s3存储桶中。请帮助我逐步说明。将Python脚本作为AWSGlue作业运行的步骤如下:步骤1:修改的Python脚本以使其与Glue兼容......
  • Python - Decorating classes
    Whenwetalkaboutdecoratingclasses,wecaneitherdecorateindividualmethodsorwecancreateadecoratortodecoratethewholeclass.classMyClass:def__init__(self,a):self.a=a@timerdefmethod1(self,x,y):print......