CSV와 Excel 파일 다루기
이 토픽을 마치면
pandas로 CSV와 Excel 파일을 읽고 쓸 수 있으며, 실무에서 자주 만나는 인코딩, 시트 선택, 열 지정 문제를 해결할 수 있습니다.
CSV란 무엇인가
CSV(Comma-Separated Values)는 쉼표로 구분된 텍스트 파일입니다. 메모장으로 열어보면 이렇게 생겼습니다.
이름,나이,도시
김훈,30,서울
이수,25,부산
박진,35,대전가장 보편적인 데이터 교환 형식입니다. 어떤 프로그래밍 언어, 어떤 운영체제에서든 읽을 수 있습니다. Excel, Google Sheets, 데이터베이스 — 모두 CSV 내보내기를 지원합니다.
CSV 읽기
import pandas as pd
# 기본 읽기df = pd.read_csv("data.csv")
# 인코딩 지정 — 한글 깨짐 방지df = pd.read_csv("data.csv", encoding="cp949")# Windows Excel에서 저장한 한글 CSV는 cp949 (또는 euc-kr)
# UTF-8 BOMdf = pd.read_csv("data.csv", encoding="utf-8-sig")한글 CSV를 읽을 때 UnicodeDecodeError가 나면 인코딩 문제입니다. 순서대로 시도합니다: utf-8 → utf-8-sig → cp949 → euc-kr.
CSV 읽기 — 고급 옵션
# 특정 열만 읽기 — 메모리 절약df = pd.read_csv("data.csv", usecols=["이름", "나이"])
# 구분자가 쉼표가 아닐 때df = pd.read_csv("data.tsv", sep="\t") # 탭 구분df = pd.read_csv("data.txt", sep="|") # 파이프 구분
# 헤더가 없는 파일df = pd.read_csv("data.csv", header=None, names=["col1", "col2", "col3"])
# 건너뛸 행 지정df = pd.read_csv("data.csv", skiprows=2) # 상위 2행 건너뜀
# 큰 파일 — 청크 단위 읽기for chunk in pd.read_csv("big.csv", chunksize=10000): process(chunk) # 10,000행씩 처리chunksize는 수백 MB 이상의 대용량 파일에서 메모리 부족을 방지합니다. 한 번에 전체를 메모리에 올리지 않고, 조각(chunk)씩 처리합니다.
Excel 읽기
# 기본 읽기 (첫 번째 시트)df = pd.read_excel("report.xlsx")
# 특정 시트df = pd.read_excel("report.xlsx", sheet_name="매출")
# 여러 시트 한 번에sheets = pd.read_excel("report.xlsx", sheet_name=None)# {'Sheet1': DataFrame, '매출': DataFrame, '비용': DataFrame}
for name, data in sheets.items(): print(f"{name}: {len(data)}행")
# 셀 범위 지정df = pd.read_excel("report.xlsx", usecols="B:E", # B~E열만 skiprows=3, # 상위 3행 건너뜀 nrows=100) # 100행만Excel 읽기에는 openpyxl 패키지가 필요합니다 (pip install openpyxl).
파일 저장
# CSV로 저장df.to_csv("output.csv", index=False, encoding="utf-8-sig")# index=False: 행 번호 열 제외# utf-8-sig: Excel에서 열어도 한글 깨지지 않음
# Excel로 저장df.to_excel("output.xlsx", index=False, sheet_name="결과")
# 여러 시트에 저장with pd.ExcelWriter("output.xlsx") as writer: df_sales.to_excel(writer, sheet_name="매출", index=False) df_cost.to_excel(writer, sheet_name="비용", index=False)CSV 저장 시 encoding="utf-8-sig"를 쓰면, Windows Excel에서 열 때 한글이 깨지지 않습니다. utf-8로 저장하면 Excel에서 깨지는 경우가 많습니다.
실전 워크플로 — CSV 병합
여러 월별 CSV를 하나로 합치는 것은 매우 흔한 작업입니다.
import glob
# 폴더 안의 모든 CSV 찾기files = glob.glob("monthly_data/*.csv")print(f"{len(files)}개 파일 발견")
# 읽어서 합치기dfs = []for f in sorted(files): temp = pd.read_csv(f, encoding="utf-8-sig") temp["source_file"] = f # 원본 파일명 기록 dfs.append(temp)
df_all = pd.concat(dfs, ignore_index=True)print(f"총 {len(df_all)}행")
# 결과 저장df_all.to_csv("merged_all.csv", index=False, encoding="utf-8-sig")ignore_index=True를 넣지 않으면 각 파일의 인덱스가 그대로 유지되어 0, 1, 2, ..., 0, 1, 2, ... 형태가 됩니다.
핵심 정리
CSV와 Excel은 데이터 분석의 입구와 출구입니다. 외부에서 데이터를 받으면 CSV/Excel이고, 결과를 전달할 때도 CSV/Excel인 경우가 대부분입니다. 인코딩(utf-8-sig vs cp949), 시트 선택, 열 지정 — 이 세 가지만 확실히 알면 "파일이 안 열려요" 문제의 90%를 해결할 수 있습니다.