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
왜냐하면 파일마다 읽는 시간이 많지 않아요.
나는 형식이 단원격의 조작 시간에 영향을 미쳤는지 모르겠다.
총결산
수천 줄, 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
왜냐하면 파일마다 읽는 시간이 많지 않아요.
나는 형식이 단원격의 조작 시간에 영향을 미쳤는지 모르겠다.
총결산
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
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
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
Reference
이 문제에 관하여(python에서 excel 데이터를 읽을 때의 준비 [기술 부채에 사용]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mickie895/items/f11feea53ea40de8236d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)