python에서 excel 데이터를 읽을 때의 준비 [기술 부채에 사용]

요약


python으로 excel 파일을 처리할 때 여분의 정보를 삭제합니다.
Excel 매크로를 만들 때는 서식을 적용하지 않도록 합니다.

계기.


수천 줄, 10열 정도의 excel 파일을 작업했지만, 파일 조작이 매우 무겁다.
디버깅에서 Excel 파일을 읽는 데만 10분 이상이 걸려 실제로 디버깅할 수 없습니다.
조사 결과 블랙박스화된 매크로가 나쁜 짓도 한 것으로 밝혀졌다.

이벤트


우선 이 코드와 출력 결과를 보십시오.
오차 등급 크기의 매크로와 공예품을 제외하고 저장된 데이터는 완전히 같은 3개의 Excel 파일에 대해 모든 칸의 수치 합계값만 출력하는 프로그램입니다.
import openpyxl as pyxl
import datetime as dt


def read_and_sum(path: str):
    book = pyxl.open(path)
    ans = 0
    sheet = book.worksheets[0]
    for row in range(500):
        for col in range(10):
            ans += sheet.cell(row+1, col+1).value
    book.close()
    return ans


if __name__ == '__main__':
    start = dt.datetime.now()
    print(read_and_sum("testcase1.xlsx"))
    check1 = dt.datetime.now()
    print(read_and_sum("testcase2.xlsm"))
    check2 = dt.datetime.now()
    print(read_and_sum("testcase3.xlsm"))
    end = dt.datetime.now()

    print(f"例1:{(check1 - start).total_seconds()}sec")
    print(f"例2:{(check2 - check1).total_seconds()}sec")
    print(f"例3:{(end - check2).total_seconds()}sec")
결과 내보내기
2494558
2494558
2494558
例1:0.034934sec
例2:0.045877sec
例3:12.923414sec

까닭


비록 파일의 내용은 같지만 파일 용량의 차이는 이처럼 크다.

이럴 때 많은 사람들이 알아맞힐 수 있지만 3개의 excel 파일의 차이는 포맷 설정에 있다.
testcase1의 excel 파일은 이렇습니다
단지 0~1000의 수치를 500줄 10열의 범위 내에 쓴 데이터일 뿐이다.

case2 첫 번째 칸의 글꼴과 크기를 문자 굵기로 변경합니다
다음 매크로가 적용됩니다.
Sub create_testcase()
    Dim src As Range
    Dim row As Long
    Dim col As Long

    Set src = ActiveSheet.Cells(1, 1)

    src.Copy

    For row = 1 To 500
        For col = 1 To 10
            If (row + col) Mod 2 = 1 Then
                ThisWorkbook.Sheets(1).Cells(row, col).PasteSpecial Paste:=xlPasteFormats
            End If
        Next
    Next


End Sub
석송 패턴에 형식을 복사한 결과는 다음과 같습니다.

case3은 상기 for문의row 상한선을 5000,col의 상한선을 1000으로 변경할 뿐입니다.외관은case2와 완전히 같지만, 필요하지 않은 형식의 데이터가 대량으로 삽입되어 있습니다.
이것은 극단적인 속도의 안배다.

잡담


내가 만난 엑셀 파일은 특정 테이블 형식만 빼면 파일 크기가 10MB 이상 줄어들 정도로 훌륭하게 만들어졌다.
선인이 매크로를 만들 때 예측은 단원격의 격식에 따라 복제되었다.
포맷을 삭제하면 10분 이상 읽어야 하고, 포기한 Excel 파일은 100초 만에 읽을 수 있다.
이 쓰레기 매크로를 만든 사람이 누구야!

상세 검증


양식이 어느 정도에 영향을 미쳤는지 확인하기 위해 방금 속도 측정용 원본 파일은 다음과 같이 고쳤다.
import openpyxl as pyxl
import datetime as dt


def read_and_sum(path: str):
    start = dt.datetime.now()
    book = pyxl.open(path)
    ans = 0
    sheet = book.worksheets[0]
    check1 = dt.datetime.now()
    for row in range(500):
        for col in range(10):
            ans += sheet.cell(row+1, col+1).value
    check2 = dt.datetime.now()
    book.close()
    end = dt.datetime.now()
    print(f"ファイル読み込み時間:{(check1 - start).total_seconds()}")
    print(f"セル操作時間:{(check2 - check1).total_seconds()}")
    print(f"後処理時間:{(end - check2).total_seconds()}")
    return ans


if __name__ == '__main__':
    print("例1:")
    print(read_and_sum("testcase1.xlsx"))
    print("例2:")
    print(read_and_sum("testcase2.xlsm"))
    print("例3:")
    print(read_and_sum("testcase3.xlsm"))
출력 결과는 다음과 같습니다.
例1:
ファイル読み込み時間:0.03194
セル操作時間:0.003001
後処理時間:0.0
2494558
例2:
ファイル読み込み時間:0.040884
セル操作時間:0.001993
後処理時間:0.0
2494558
例3:
ファイル読み込み時間:13.107952
セル操作時間:0.003989
後処理時間:0.0
2494558
왜냐하면 파일마다 읽는 시간이 많지 않아요.
나는 형식이 단원격의 조작 시간에 영향을 미쳤는지 모르겠다.

총결산

  • 파이톤에서 excel 파일을 조작할 때 속도를 높이기 위해 여분의 형식을 최대한 삭제합니다.
  • VBA의 훙도 의식적으로 기술 부채로 만들어야 한다.
  • 좋은 웹페이지 즐겨찾기