2017-07-27 35 views
0

我正在寫一個代碼,用於將大型Excel文件(11740行)中的單元格複製到另一個大型Excel文件(78472行)中。這兩個文件都有31列。當我運行下面的代碼時,它會拋出錯誤,有時會出現內存錯誤或有時會拒絕錯誤的權限。之後,它破壞了文件,當我手動打開文件時,出現以下錯誤消息,Python代碼製作excel文件損壞。如何糾正?

'我們發現'File1.xlsx'中的某些內容存在問題。你想我們 儘可能多地恢復?如果您信任此 工作簿的來源,請單擊「是」。

即使我點擊是,我在工作簿中也看不到任何東西。

下面是代碼

import openpyxl 
import os 
os.chdir('C:\\PYP') 
wb1=openpyxl.load_workbook('File1.xlsx') 
wb2=openpyxl.load_workbook('File2.xlsx') 
tgt=wb1.get_sheet_by_name('Trove GL Report') 
src=wb2.get_sheet_by_name('Sheet2') 
lim1=tgt.max_row 
lim2=src.max_row 
clim=31 
lim3=lim1+lim2 
lim3 
for i in range(1,lim2+1,1): 
    for j in range(1,clim+1,1): 
     tgt.cell(row=lim1+i,column=j).value=src.cell(row=i+1,column=j).value 
wb1.save('File1.xlsx') 

回答

0

如果該文件是非常大的,那麼你應該在成批讀它,以避免內存錯誤。

段:

import pandas as pd 

excel = pd.ExcelFile("File1.xlsx") 

for sheet in excel.sheet_names: 
    reader = excel.parse(sheet, chunksize=1000): 
    for chunk in reader: 
     #parse chunk here 
0

有一種特殊的read_only模式Openpyxl,可以讀取較大的工作簿以減少內存開銷。完整的信息可以在http://openpyxl.readthedocs.io/en/default/optimized.html的文檔中找到。

在你的代碼的變化將僅僅是:

wb2=openpyxl.load_workbook('File2.xlsx', read_only=True) 

這不會內存使用你寫的工作簿幫助,但可能足以避免你所看到的內存錯誤。如果沒有,可能值得從目標文件讀取數據,在追加新數據之前先使用write-only模式將其寫入新工作簿(注意:我沒有嘗試過,因此不確定它會帶來什麼好處)。

如果我正確理解從您的代碼,你試圖將數據從一個工作簿到另一個追加,代碼或許可以在某種程度上也得到了簡化 - 例如爲:

from openpyxl import load_workbook 
tgt_wb=openpyxl.load_workbook('File1.xlsx') 
src_wb=openpyxl.load_workbook('File2.xlsx', read_only=True) 
tgt_ws=tgt_wb['Trove GL Report'] 
src_ws=src_wb['Sheet2'] 
for row, row_cells in enumerate(src_ws.rows, tgt_ws.max_row + 1): 
    for col, cell in enumerate(row_cells, 1): 
     tgt_ws.cell(row=row, column=col).value = cell.value 
tgt_wb.save('File1.xlsx')