Python可以更快地读取Excel文件

时间:2018-03-21 07:28:08

标签: python excel python-3.x openpyxl

我创建了一个读取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))

2 个答案:

答案 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进程的性能可能是一个棘手的主题,因此您需要了解有关瓶颈的更多详细信息。如果无法提高性能,可能会尝试找到获取相同数据的替代方法。