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

时间:2017-06-26 17:26:42

标签: 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()非常缓慢。我使用xlrdpandas模块尝试了类似的方法。仍然很慢。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

  • 将您的SQL语句保留在循环之外
  • 使用class MyClass extends Foo<T> { .... } MyClass myClassInstance = MyClass.class.newInstance(); 一次将大量行传递给驱动程序

这些可以像

这样结合起来
executemany

如果您只想要行的子集,请查看使用INSERT_SQL = "INSERT INTO mytable (name, age…) VALUES (%s, %s, …)" c.executemany(INSERT_SQL, ws.values)

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

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