openpyxl 자동화 excel로 읽기와 쓰기... 가능할지 고민

10526 단어 OpenpyxlPython

요약


Python에서 업무 파일을 조작할 때 Excel 파일은 Excel 파일이고 처리의 병목이다.가능한 한 텍스트 파일로 처리하세요.

분규


두 Excel 자료를 직장에서 병합하기로 결정했습니다.
수량이 적으면 최악의 안목으로 확인하면 되지만 2000개 이상의 파일 이상에서 각 파일이 합쳐진 팀도 1만 줄을 넘었다.
어쩔 수 없기 때문에 우선 차분을 추출하기 위해 익숙한 Python으로 차분 비교용 스크립트를 썼지만 이틀 동안 방치해도 파일 한 개의 차분이 완성되지 않았다.

검증


오픈pyxl은 생각보다 느려서 특정 조건에서 시간을 무제한으로 사용하는 소프트웨어가 된 것 같다.
테스트를 위해 다음 코드를 먼저 실행하고 excel로 열어 xlsx 형식으로 다시 저장합니다.
너무 간단해서 내용의 해설을 생략했다.
CreateTestCase.py
import random


with open("testdata_csv.csv", "w") as out_file:
    for _ in range(50000):
        out_file.write(",".join([str(random.randint(0, 1000)) for _ in range(100)]) + "\n")

그리고 다음 코드로 그걸 읽었어요.시간이 너무 걸리기 때문에 적당한 곳에서 프로그램을 없애야 한다.
CalcTestCase.py
import openpyxl as xl
import datetime as dt


ROWS = 50000
COLS = 100
CHECK_INTERVAL = 10


def put_interval_to_csv(start: dt.datetime, end: dt.datetime, row_count, target):
    with open(f"log_{target}.csv", "a") as log_file:
        log_file.write(f"{row_count},{(end - start).seconds}.{(end - start).microseconds:06}\n")


def calc_excel():
    book = xl.load_workbook("testdata_csv.xlsx", True)
    # VBAと違い、シート番号は0スタート
    sheet = book.worksheets[0]

    start_check = dt.datetime.now()

    for row in range(ROWS):
        if not row % CHECK_INTERVAL:
            start_check = dt.datetime.now()
        row_sum = 0
        for col in range(COLS):
            row_sum += sheet.cell(row + 1, col + 1).value
        print(row_sum)
        if not row % CHECK_INTERVAL:
            end_check = dt.datetime.now()
            put_interval_to_csv(start_check, end_check, row, "excel")


def calc_csv():
    with open("testdata_csv.csv") as read_file:
        start_check = dt.datetime.now()
        for row in range(ROWS):
            cells = read_file.readline().rstrip().split(",")
            row_sum = 0
            for col in range(COLS):
                row_sum += int(cells[col])
            print(row_sum)
        end_check = dt.datetime.now()
        put_interval_to_csv(start_check, end_check, row, "csv")


if __name__ == '__main__':
    calc_csv()
    calc_excel()

csv와 xlsx 형식에서 모두 print 각 업계의 합계수입니다.
그러나 xlsx에서 10줄마다 속도를 측정하고 csv는 전체 실행 시간의 속도를 측정한다.

검증 결과


텍스트 파일의 총 출력은 5000줄에 1.297초가 걸리지만 csv 파일의 출력은 다음과 같은 결과가 됩니다.
세로축은 한 줄 처리에 걸리는 초수이고 가로축은 열이다.

파란색 접선은 결과적으로 가볍게 치면 직선처럼 보이기 때문에 excel의 기능으로 일차식 근사식을 만들었고 공식도 출력했다.
만약 이 경사라면, 마지막까지 계속한다면, 대략 $4.5\times10^7$초, 500일 이상의 계산이 필요합니다.
또한 COL을 5로 바꾸면 상기 처리 시간의 도표의 경사율은 0.016로 대략 20분의 1이다.읽는 줄이 가장 큰 영향을 미치는 것 같습니다.

해결 방법


Q. Excel 파일 작업이 느립니다.왜 그래?
A. 엑셀을 사용하지 않으면 됩니다.
따라서 작업 중, Excel 파일을 csv 파일에 잠시 저장한 후에 작업을 진행했습니다.이것은 VBA로 자동으로 변환된 것이다.

좋은 웹페이지 즐겨찾기