본문 바로가기

Python

[Python] 대용량 엑셀 데이터 파일 효율적으로 읽어오기

이번 포스팅에서는 Python에서 대용량 엑셀 파일을 효율적으로 읽어오는 4가지 방법을 비교해보려고 한다.

 

1. CSV vs 엑셀: 처리 성능 비교

대용량 데이터를 다룰 때는 CSV 형식이 빠르고 효율적인 방법이다. 그 이유는 다음과 같다.

  1. 파일 형식의 차이
    - CSV는 단순한 텍스트 형식이다
    - 엑셀은 복잡한 XML 기반 구조다
    - 엑셀은 압축 해제 과정이 필요하다
  2. 파싱 복잡도
    - CSV는 단순한 구분자 기반 파싱이면 충분하다
    - 엑셀은 복잡한 바이너리 구조 파싱이 필요하다
  3. 메모리 사용
    - 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
 

장단점

  • 장점: 처리 속도가 매우 빠르다, 메모리 효율성이 높다
  • 단점: 추가 라이브러리 설치가 필요하다