2017-06-26 59 views
3

我試圖使用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

回答

0

您確實需要對代碼進行基準測試,並提供有關工作表大小和處理時間的信息。

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快一點,因爲它具有較小的內存佔用量,主要與作爲只讀庫有關。但它總是將整個工作簿加載到內存中,這可能不是你想要的。