openpyxl 자동화 excel로 읽기와 쓰기... 가능할지 고민
요약
Python에서 업무 파일을 조작할 때 Excel 파일은 Excel 파일이고 처리의 병목이다.가능한 한 텍스트 파일로 처리하세요.
분규
두 Excel 자료를 직장에서 병합하기로 결정했습니다.
수량이 적으면 최악의 안목으로 확인하면 되지만 2000개 이상의 파일 이상에서 각 파일이 합쳐진 팀도 1만 줄을 넘었다.
어쩔 수 없기 때문에 우선 차분을 추출하기 위해 익숙한 Python으로 차분 비교용 스크립트를 썼지만 이틀 동안 방치해도 파일 한 개의 차분이 완성되지 않았다.
검증
오픈pyxl은 생각보다 느려서 특정 조건에서 시간을 무제한으로 사용하는 소프트웨어가 된 것 같다.
테스트를 위해 다음 코드를 먼저 실행하고 excel로 열어 xlsx 형식으로 다시 저장합니다.
너무 간단해서 내용의 해설을 생략했다.
CreateTestCase.pyimport 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.pyimport 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로 자동으로 변환된 것이다.
Reference
이 문제에 관하여(openpyxl 자동화 excel로 읽기와 쓰기... 가능할지 고민), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mickie895/items/3aecd37229c848bdad41
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
두 Excel 자료를 직장에서 병합하기로 결정했습니다.
수량이 적으면 최악의 안목으로 확인하면 되지만 2000개 이상의 파일 이상에서 각 파일이 합쳐진 팀도 1만 줄을 넘었다.
어쩔 수 없기 때문에 우선 차분을 추출하기 위해 익숙한 Python으로 차분 비교용 스크립트를 썼지만 이틀 동안 방치해도 파일 한 개의 차분이 완성되지 않았다.
검증
오픈pyxl은 생각보다 느려서 특정 조건에서 시간을 무제한으로 사용하는 소프트웨어가 된 것 같다.
테스트를 위해 다음 코드를 먼저 실행하고 excel로 열어 xlsx 형식으로 다시 저장합니다.
너무 간단해서 내용의 해설을 생략했다.
CreateTestCase.pyimport 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.pyimport 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로 자동으로 변환된 것이다.
Reference
이 문제에 관하여(openpyxl 자동화 excel로 읽기와 쓰기... 가능할지 고민), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mickie895/items/3aecd37229c848bdad41
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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")
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()
텍스트 파일의 총 출력은 5000줄에 1.297초가 걸리지만 csv 파일의 출력은 다음과 같은 결과가 됩니다.
세로축은 한 줄 처리에 걸리는 초수이고 가로축은 열이다.
파란색 접선은 결과적으로 가볍게 치면 직선처럼 보이기 때문에 excel의 기능으로 일차식 근사식을 만들었고 공식도 출력했다.
만약 이 경사라면, 마지막까지 계속한다면, 대략 $4.5\times10^7$초, 500일 이상의 계산이 필요합니다.
또한 COL을 5로 바꾸면 상기 처리 시간의 도표의 경사율은 0.016로 대략 20분의 1이다.읽는 줄이 가장 큰 영향을 미치는 것 같습니다.
해결 방법
Q. Excel 파일 작업이 느립니다.왜 그래?
A. 엑셀을 사용하지 않으면 됩니다.
따라서 작업 중, Excel 파일을 csv 파일에 잠시 저장한 후에 작업을 진행했습니다.이것은 VBA로 자동으로 변환된 것이다.
Reference
이 문제에 관하여(openpyxl 자동화 excel로 읽기와 쓰기... 가능할지 고민), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mickie895/items/3aecd37229c848bdad41
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(openpyxl 자동화 excel로 읽기와 쓰기... 가능할지 고민), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mickie895/items/3aecd37229c848bdad41텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)