我创建了一个读取Excel文档的脚本,检查第一行是否包含“UPDATED”。如果是这样,它将整行写入具有相同Tab名称的另一个Excel文档。
我的Excel文档是23张,每张表上有1000行,现在完成此操作需要15分钟以上。有没有办法加快速度呢?
我在考虑多线程或多处理,但我不知道哪一个更好。
更新:我的程序运行15分钟的事实是由READ-ONLY模式引起的,当我删除它时,它只需要2秒钟来运行程序
import openpyxl
import os
from datetime import datetime
titles = ["Column1", "Column2", "Column3", "Column4", "Column5","Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12", "Column13", "Column14", "Column15", "Column16"]
def main():
oldFilePath= os.getcwd() + "\oldFile.xlsx"
newFilePath= os.getcwd() + "\newFile.xlsx"
wb = openpyxl.load_workbook(filename=oldFilePath, read_only=True)
wb2 = openpyxl.Workbook()
sheets = wb.get_sheet_names()
sheets2 = wb2.get_sheet_names()
#removes all sheets in newFile.xlsx
for sheet in sheets2:
temp = wb2.get_sheet_by_name(sheet)
wb2.remove_sheet(temp)
for tab in sheets:
print("Sheet: " + str(tab))
rowCounter = 2
sheet = wb[tab]
for row in range(sheet.max_row):
if sheet.cell(row=row + 1, column=1).value == "": #if cell is empty stop reading
break
elif sheet.cell(row=row + 1, column=1).value == "UPDATED":
if tab not in sheets2:
sheet2 = wb2.create_sheet(title=tab)
sheet2.append(titles)
for x in range(1, 17):
sheet2.cell(row=rowCounter, column=x).value = sheet.cell(row=row + 1, column=x).value
rowCounter += 1
sheets2 = wb2.get_sheet_names()
wb2.save(filename=newFilePath)
if __name__ == "__main__":
startTime = datetime.now()
main()
print("Script finished in: " + str(datetime.now() - startTime))
答案 0 :(得分:2)
对于这样的小型工作簿,不需要使用只读模式,并且通过不明智地使用它,您自己会导致问题。每次调用ws.cell()
都会强制openpyxl再次解析工作表。
所以,要么停止使用只读模式,要么使用我在上一个问题上建议的ws.iter_rows()
。
一般来说,如果你认为某些事情运行缓慢,你应该总是对它进行分析,而不是仅仅尝试一些事情并希望最好。
答案 1 :(得分:1)
你应该看看一些很棒的多处理教程,例如: https://www.blog.pythonlibrary.org/2016/08/02/python-201-a-multiprocessing-tutorial/
此外,Python文档将为您提供一些很好的示例: https://docs.python.org/3.6/library/multiprocessing.html
您应该特别注意使用池和队列等主题。
多处理将帮助您克服Global Interpreter Lock的限制,因此这可能是提高性能的好方法。
调整I / O进程的性能可能是一个棘手的主题,因此您需要了解有关瓶颈的更多详细信息。如果无法提高性能,可能会尝试找到获取相同数据的替代方法。