【发布时间】:2021-01-13 09:19:06
【问题描述】:
我有一个 9000 行 x 30 列的 Excel 文件,其中包含我想从一个 Excel 工作簿复制到另一个工作簿的内容。然而,我面临的问题是,当我运行我的代码时,它永远不会停止运行。更重要的是,内存使用率一直在上升,直到它使用了我笔记本电脑可用内存的 90%-98% (screenshot)。
我尝试使用timeit 来查看我的代码有多慢,但即使这样也不会执行。我拒绝相信这是我的 Excel 文件的大小,所以它一定是我的代码的问题。我无法准确指出它可能是什么,因为我对openpyxl 的经验非常有限,因此非常感谢任何建议。我正在使用openpyxl 3.0.4 和Python 3.8.7。
def copy(source, destination):
# Open source workbook
wb1 = load_workbook(source)
ws1 = wb1.worksheets[0]
# Open destination workbook
wb2 = load_workbook(destination)
ws2 = wb2.active
# Get rows and columns of source
max_rows = ws1.max_row
max_columns = ws1.max_column
# Copy cells from source to destination
for i in range(1, max_rows + 1):
for j in range(1, max_columns + 1):
# Read from source
c = ws1.cell(row=i, column=j)
# Write to destination file
ws2.cell(row=i, column=j).value = c.value
# Save source
wb2.save(str(destination))
copy_src = r"C:\Users\username\Documents\copy_from.xlsx"
copy_dst = r"C:\Users\username\Documents\copy_to.xlsx"
time = timeit.timeit('%s' % copy(copy_src, copy_dst))
print("Execution time for copy(): %f seconds" % time)
【问题讨论】:
-
你可以访问这个:- stackoverflow.com/questions/44593705/…
-
我已经尝试了答案中给出的解决方案,但它不起作用。同样的事情也会发生。内存在增加,它永远不会真正结束。
-
9000x30 是 小 表。一张表最多可以有 1M 行。这段代码有什么意义呢?
ws1.max_row返回什么?您是否尝试复制 1M 行?为什么不使用for row in ws1: for cell in row:? -
我尝试使用@KishanYadav 上面给出的解决方案,它使用
for row in ws1: for cell in row:,但这似乎并没有解决我的问题。至于ws1.max_row返回的内容,似乎即使是这样的简单代码:pastebin.com/kEUXQDvG 也不会运行。这表明 Excel 工作簿有问题,但我不确定是什么问题。我尝试按照建议的答案之一清除空白,但这并没有解决问题。 -
我已尝试下载以下 .csv 文件(将其转换为 .xlsx):data.cityofnewyork.us/Business/Legally-Operating-Businesses/… 并运行上面发布的代码。完成执行仍需要一段时间(仍然不显示 max_rows),但尽管有时间,但它返回
0.007179,这对我来说似乎很奇怪。
标签: python python-3.x openpyxl