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

问题描述:

我试图使用Python将数据从.xlsx文件读取到MySQL数据库中。使用Python读取.xlsx文件的最快方法

这里是我的代码:

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模块的类似方法。仍然很慢。有什么想法吗?

+6

您是否探讨过'pd.read_excel('filename.xlsx','sheetname')。to_sql(...,conn_details,..)'? – Zero

+0

编辑:看来你不能使用ws.rows row_offset,只能用ws.iter_rows。并且我不确定ws.rows是否更快 – citizen2077

+1

将工作表另存为CSV并使用'read_csv'可显着缩短时间。 'read_excel'使用Python代码,而'read_csv'使用C. – ayhan

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

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快一点,因为它具有较小的内存占用量,主要与作为只读库有关。但它总是将整个工作簿加载到内存中,这可能不是你想要的。