이번 포스팅에서는 Python에서 대용량 엑셀 파일을 효율적으로 읽어오는 4가지 방법을 비교해보려고 한다.
1. CSV vs 엑셀: 처리 성능 비교
대용량 데이터를 다룰 때는 CSV 형식이 빠르고 효율적인 방법이다. 그 이유는 다음과 같다.
- 파일 형식의 차이
- CSV는 단순한 텍스트 형식이다
- 엑셀은 복잡한 XML 기반 구조다
- 엑셀은 압축 해제 과정이 필요하다 - 파싱 복잡도
- CSV는 단순한 구분자 기반 파싱이면 충분하다
- 엑셀은 복잡한 바이너리 구조 파싱이 필요하다 - 메모리 사용
- CSV는 순차적 읽기가 가능하다
- 엑셀은 전체 파일을 한번에 로드해야 한다
하지만 실무에서는 여러 가지 이유로 엑셀 파일을 직접 다뤄야 하는 경우가 많다.
- 기존 시스템이 엑셀 기반으로 구축되어 있는 경우
- 최종 사용자가 엑셀 형식을 요구하는 경우
- 엑셀의 서식이나 수식을 보존해야 하는 경우
- CSV 변환 시 데이터 손실이 우려되는 경우
2. 엑셀 파일 읽어오는 방법 비교
2-1. 기본 Pandas 방식
가장 간단하고 직관적인 방법으로, pandas의 read_excel() 함수를 사용하는 방식이다.
import pandas as pd
df = pd.read_excel('excel_path.xlsx')
df
장단점
- 장점: 구현이 매우 간단하다, 별도 의존성이 없다
- 단점: 메모리 사용량이 크다, 대용량 처리 시 느리다
2-2. PowerShell COM 객체 방식
PowerShell을 통해 Excel COM 객체를 사용하여 CSV로 변환 후 읽는 방식이다.
def read_excel_with_powershell(excel_path, csv_path='temp.csv'):
ps_command = f'''
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$workbook = $excel.Workbooks.Open((Resolve-Path "{excel_path}").Path)
$workbook.SaveAs((Resolve-Path .).Path + "\\{csv_path}", 6)
$workbook.Close($false)
$excel.Quit()
'''
# PowerShell 실행 및 CSV 읽기 코드
장단점
- 장점: CSV 변환을 통한 빠른 처리가 가능하다
- 단점: Windows 환경이 필요하다, Excel 프로그램 설치가 필요하다
2-3. Win32COM 방식
Win32COM 라이브러리를 사용하여 Python에서 직접 Excel COM 객체를 제어하는 방식이다.
def read_excel_fast(excel_path, csv_path='temp.csv'):
# Win32COM을 사용한 Excel 변환
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = False
wb = excel.Workbooks.Open(excel_path)
wb.SaveAs(csv_path, FileFormat=6)
# CSV 읽기 및 처리 코드
장단점
- 장점: 안정적인 COM 객체 제어가 가능하다
- 단점: Windows 환경만 지원한다, pywin32 패키지가 필요하다
2-4. Polars 방식
Rust 기반의 Polars 라이브러리를 사용하는 방식이다.
import polars as pl
df = pl.read_excel('excel_path.xlsx')
df
장단점
- 장점: 처리 속도가 매우 빠르다, 메모리 효율성이 높다
- 단점: 추가 라이브러리 설치가 필요하다
'Python' 카테고리의 다른 글
[Python] PyGWalker 소개 및 기본 사용법 (1) | 2025.01.06 |
---|---|
[Python] 해시(Hash) 알고리즘 : 안전한 비밀번호 암호화 구현하기 (0) | 2024.12.23 |
[Python] PyInstaller로 파이썬 스크립트 배포하기 (2) | 2024.12.10 |
[Python] Streamlit 소개 및 기초 사용법 (3) | 2024.11.29 |
[Python] VSCode에서 Python 코드 정렬하기 (1) | 2024.11.11 |