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

soat7uwm  于 2023-01-11  发布在  Python
关注(0)|答案(3)|浏览(308)

我正在尝试使用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模块。仍然很慢。有什么想法吗?

nbnkbykc

nbnkbykc1#

您确实需要对代码进行基准测试,并提供有关工作表大小和处理工作表所用时间的信息。
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快一些,因为它占用的内存更少,这主要是因为它是一个只读库,但它总是将整个工作簿加载到内存中,这可能不是你想要的。

r6l8ljro

r6l8ljro2#

对于阅读,尝试http://github.com/AndyStricker/FastXLSX它声称使用expat进行基于事件的解析和基于流的zip读取器。只有共享的字符串表必须保存在内存中。
如果仍然很慢,你可以试着用Nuitka编译它。我曾经用Nuitka编译的lib获得25%的速度提升。
对于写入,请尝试http://github.com/kz26/PyExecelerate
对于MySQL,尝试使用支持cython的CyMySQL http://github.com/nakagami/CyMySQL进行批量插入,根据我的经验,这与pymysql相比显著提高了插入速度。我看到的区别只适用于紧密循环中的大批量插入。尝试不同的更大的批量大小以获得最佳速度。

gt0wga4j

gt0wga4j3#

它有一个rust库calaminepython`s bindings,它提供10 - 20倍的读取加速。

from python_calamine import get_sheet_data

recs: list[list] = get_sheet_data("myfile.xlsx", sheet=0)

如果你想把它变成一个pd.DataFrame

df = pd.DataFrame.from_records(recs)

相关问题