我正在尝试使用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
模块。仍然很慢。有什么想法吗?
3条答案
按热度按时间nbnkbykc1#
您确实需要对代码进行基准测试,并提供有关工作表大小和处理工作表所用时间的信息。
openpyxl的只读模式本质上是一种内存优化,它避免了将整个工作表加载到内存中。当解析Excel工作表时,大部分工作涉及到将XML转换为Python,这是有限制的。
然而,有两种优化方法确实会浮现在脑海中:
executemany
一次将许多行传递给驱动程序这些可以结合在一起
如果只需要行的子集,请使用
itertools.islice
这应该比你当前的代码快,但你不应该期待奇迹。
就纯粹的性能而言,xlrd在阅读工作表时比openpyxl快一些,因为它占用的内存更少,这主要是因为它是一个只读库,但它总是将整个工作簿加载到内存中,这可能不是你想要的。
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相比显著提高了插入速度。我看到的区别只适用于紧密循环中的大批量插入。尝试不同的更大的批量大小以获得最佳速度。
gt0wga4j3#
它有一个rust库
calamine
和python`s bindings,它提供10 - 20倍的读取加速。如果你想把它变成一个
pd.DataFrame
: