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

标签 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() 

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

最佳答案

您确实需要对您的代码进行基准测试,并提供有关工作表大小和处理它所花费时间的信息。

openpyxl 的只读模式本质上是一种内存优化,避免将整个工作表加载到内存中。在解析 Excel 工作表时,涉及的大部分工作都是将 XML 转换为 Python,这有一些限制。

但是,我确实想到了两个优化:

  • 让你的 SQL 语句在循环之外
  • 使用 executemany 一次将大量行传递给驱动程序

这些可以组合成类似的东西

INSERT_SQL = "INSERT INTO mytable (name, age…) VALUES (%s, %s, …)"
c.executemany(INSERT_SQL, ws.values)

如果您只想要行的一个子集,那么请考虑使用 itertools.islice

这应该比您当前的代码更快,但您不应该期待奇迹。

就纯性能而言,xlrd 在读取工作表时比 openpyxl 快一点,因为它占用的内存更小,这主要与它是一个只读库有关。但它总是将整个工作簿加载到内存中,这可能不是您想要的。

关于python - 使用 Python 读取 .xlsx 文件的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44765252/

相关文章:

python - Flask 和 Web.py 都卡在 atexit 上

java - 如何通过文本字段将 Java 变量插入到查询中?

php - 使用 Sphinx/MySQL 一次从两个表中获取数据有更好的方法吗?

pandas - 如何指示 Pandas、Python 中分类列中值的计数?

python - 使用 df.apply 处理异常

Python:按键选择字典项

python - 删除矩阵中的行或列时输出错误

python - 填充缺失的时间戳并对不同列应用不同的操作

python - 使用 python 3.x 进行网络抓取,我使用 pytharm

php - 使用带有 JOIN 语句的 RealURL (TYPO3)