2017-07-27 320 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')