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

Bri*_*ley 6 python mysql xlrd pandas openpyxl

我正在尝试使用 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() 
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*ark 2

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

\n\n

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

\n\n

然而,我确实想到了两个优化:

\n\n
    \n
  • 将 SQL 语句放在循环之外
  • \n
  • 用于executemany一次将大量行传递给驱动程序
  • \n
\n\n

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

\n\n
INSERT_SQL = "INSERT INTO mytable (name, age\xe2\x80\xa6) VALUES (%s, %s, \xe2\x80\xa6)"\nc.executemany(INSERT_SQL, ws.values)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您只想要行的子集,请查看使用itertools.islice

\n\n

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

\n\n

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

\n