6. Python으로 CSV 파일 다루기 — 읽기, 쓰기, pandas까지 완벽 정리
처음 엑셀 데이터를 다룰 때 어떤 라이브러리를 선택해야 할지 몰라 헤맸던 적이 있습니다. 결국 CSV 형식 하나면 대부분의 데이터 작업이 해결된다는 사실을 한참이 지나서야 깨달았습니다
이 글에서는 CSV가 무엇인지부터, Python 기본 csv 모듈로 읽고 쓰는 방법, 실무에서 훨씬 많이 쓰이는 pandas를 활용한 데이터 처리, 그리고 자주 발생하는 오류 해결까지 — 단계적으로 안내해 드리겠습니다.
CSV란 무엇인가 — 엑셀보다 단순하고, 그래서 더 강력한 형식
CSV는 Comma-Separated Values의 약자로, 쉼표로 데이터를 구분한 텍스트 파일입니다. 엑셀처럼 화려한 서식은 없지만, 그 단순함이 오히려 가장 큰 강점입니다.
비유하자면 CSV는 줄 노트와 같습니다. 엑셀이 색깔, 테두리, 수식까지 갖춘 양식지라면, CSV는 칸만 구분된 단순한 줄 노트입니다. 꾸밈은 없지만 어디서든 열 수 있고, 프로그램끼리 데이터를 주고받을 때 가장 널리 쓰이는 형식입니다.
실제로 CSV 파일을 메모장으로 열면 아래처럼 보입니다.
이름,나이,직업
김현욱,35,개발자
이하늘,28,디자이너
박지수,31,기획자
엑셀로 열면 이 쉼표들이 자동으로 셀 구분선으로 변환되어 표 형태로 표시됩니다. Python은 이 파일을 직접 읽어서 원하는 방식으로 처리할 수 있습니다.
CSV를 배워야 하는 이유
- 범용성이 압도적입니다 — 엑셀, 구글 스프레드시트, 데이터베이스 모두 CSV 내보내기를 지원합니다.
- 용량이 작습니다 — 서식 정보가 없어 동일한 데이터라도 엑셀보다 파일 크기가 훨씬 작습니다.
- 자동화에 가장 적합합니다 — 매일 쌓이는 데이터를 Python으로 자동 처리할 때 CSV가 사실상 표준입니다.
- 별도 라이브러리 없이 바로 사용 가능합니다 — Python 기본 모듈만으로도 충분히 다룰 수 있습니다.
csv 모듈로 CSV 파일 다루기 — 설치 없이 바로 시작
Python에는 CSV 처리를 위한 csv 모듈이 기본으로 내장되어 있습니다. pip 설치 없이 바로 사용할 수 있습니다.
CSV 파일 쓰기
VS Code에서 새 파일을 만들고 아래 코드를 작성합니다.
import csv
# 저장할 데이터 준비
data = [
["이름", "나이", "직업"],
["김현욱", 35, "개발자"],
["이하늘", 28, "디자이너"],
["박지수", 31, "기획자"],
]
with open("members.csv", "w", encoding="utf-8-sig", newline="") as file:
writer = csv.writer(file)
writer.writerows(data)
print("CSV 파일이 생성되었습니다.")
⚠️
utf-8-sigvsutf-8: 한글이 포함된 CSV를 Windows 엑셀에서 바로 열 경우,utf-8인코딩으로 저장하면 한글이 깨집니다. 엑셀 호환이 필요하다면 반드시utf-8-sig를 사용하십시오.
⚠️
newline="": Windows 환경에서 이 옵션을 빠뜨리면 행과 행 사이에 빈 줄이 한 칸씩 추가됩니다. CSV 쓰기 시에는 항상 포함하십시오.
CSV 파일 읽기
import csv
with open("members.csv", "r", encoding="utf-8-sig") as file:
reader = csv.reader(file)
for row in reader:
print(row)
실행 결과:
['이름', '나이', '직업']
['김현욱', '35', '개발자']
['이하늘', '28', '디자이너']
['박지수', '31', '기획자']
💡 주의: CSV에서 읽어온 숫자는 모두 문자열(str) 로 처리됩니다. 나이를 숫자로 사용하고 싶다면
int(row[1])처럼 형변환이 필요합니다.
DictReader — 컬럼명으로 데이터 접근하기
행 번호 대신 컬럼 이름으로 데이터를 다루면 코드가 훨씬 직관적입니다.
import csv
with open("members.csv", "r", encoding="utf-8-sig") as file:
reader = csv.DictReader(file)
for row in reader:
print(f"이름: {row['이름']}, 직업: {row['직업']}")
실행 결과:
이름: 김현욱, 직업: 개발자
이름: 이하늘, 직업: 디자이너
이름: 박지수, 직업: 기획자
pandas로 CSV 다루기 — 실무 수준의 데이터 처리
csv 모듈이 기본기라면, pandas는 실무에서 데이터를 본격적으로 다룰 때 사용하는 도구입니다. 수백만 행의 데이터도 몇 줄의 코드로 처리할 수 있고, 필터링·정렬·집계 등 엑셀에서 하던 작업 대부분을 코드로 자동화할 수 있습니다.
pandas 설치하기
가상환경이 활성화된 상태에서 설치합니다.
pip install pandas
CSV 파일 읽기 — read_csv()
import pandas as pd
df = pd.read_csv("members.csv", encoding="utf-8-sig")
print(df)
실행 결과:
이름 나이 직업
0 김현욱 35 개발자
1 이하늘 28 디자이너
2 박지수 31 기획자
한 줄로 CSV를 읽어 표 형태(DataFrame)로 만들어줍니다. 이 df 변수 하나로 이후 모든 데이터 처리를 수행합니다.

자주 쓰는 pandas 기본 조작
import pandas as pd
df = pd.read_csv("members.csv", encoding="utf-8-sig")
# 상위 몇 행만 확인
print(df.head(2))
# 특정 컬럼만 선택
print(df["이름"])
# 조건으로 필터링 — 나이가 30 이상인 행만
print(df[df["나이"] >= 30])
# 나이 기준으로 정렬
print(df.sort_values("나이", ascending=False))
# 기본 통계 확인
print(df.describe())
CSV 파일로 저장하기 — to_csv()
pandas로 처리한 데이터를 다시 CSV로 저장합니다.
# 인덱스 번호 없이 저장
df.to_csv("members_sorted.csv", index=False, encoding="utf-8-sig")
💡
index=False: 이 옵션을 빠뜨리면 0, 1, 2 같은 행 번호가 첫 번째 열로 함께 저장됩니다. 대부분의 경우 필요 없으므로 항상index=False를 추가하는 것을 권장합니다.
실전 예제 — 매출 데이터 자동 집계하기
이론에서 벗어나, 실무에서 바로 쓸 수 있는 예제를 하나 살펴보겠습니다. 매일 쌓이는 매출 CSV 파일을 읽어서 담당자별 합계를 자동으로 계산하는 코드입니다.
먼저 아래 내용으로 sales.csv 파일을 만들겠습니다.
담당자,상품,금액
김현욱,노트북,1200000
이하늘,마우스,35000
김현욱,모니터,450000
박지수,키보드,85000
이하늘,웹캠,120000
박지수,마우스,35000
import pandas as pd
df = pd.read_csv("sales.csv", encoding="utf-8-sig")
# 담당자별 총 매출 합계
result = df.groupby("담당자")["금액"].sum().reset_index()
result.columns = ["담당자", "총매출"]
result = result.sort_values("총매출", ascending=False)
print(result)
result.to_csv("sales_summary.csv", index=False, encoding="utf-8-sig")
print("집계 완료. sales_summary.csv에 저장되었습니다.")
실행 결과:
담당자 총매출
0 김현욱 1650000
1 이하늘 155000
2 박지수 120000
엑셀에서 피벗 테이블을 만들던 작업을 코드 다섯 줄로 해결했습니다. 파일 이름만 바꾸면 내일도, 다음 달도 같은 코드로 동일한 집계를 자동으로 처리할 수 있습니다.
자주 발생하는 오류와 해결법
오류 1 — 한글이 깨져서 출력되는 경우
원인: 인코딩 불일치
해결: 파일 저장 시 utf-8-sig, 읽기 시도 시 cp949 또는 euc-kr을 시도
# 인코딩을 모를 때 chardet 라이브러리로 자동 감지
pip install chardet
import chardet
with open("unknown.csv", "rb") as f:
result = chardet.detect(f.read())
print(result["encoding"])
오류 2 — pandas로 읽었더니 숫자 컬럼이 object(문자열)로 인식되는 경우
원인: 숫자 사이에 쉼표(1,000)나 공백이 포함된 경우
해결: 읽은 후 변환 처리
df["금액"] = df["금액"].str.replace(",", "").astype(int)
오류 3 — FileNotFoundError — 파일을 찾을 수 없는 경우
원인: 작업 디렉토리와 파일 위치 불일치 (이전 파일 입출력 편에서 상세히 다룬 내용)
해결: os.path.abspath(__file__) 기준으로 경로 설정
import os
base_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(base_dir, "members.csv")
df = pd.read_csv(file_path, encoding="utf-8-sig")
마무리 — 핵심 요약
✅ Python CSV 처리 체크리스트
- 한글 포함 CSV는
utf-8-sig인코딩을 사용합니다 — 엑셀 호환 보장 - CSV 쓰기 시
newline=""을 항상 추가합니다 — 빈 줄 삽입 방지 - 단순 읽기/쓰기는
csv모듈로 충분합니다 — 별도 설치 불필요 - 데이터 분석·가공이 필요하면
pandas를 사용합니다 — 필터링, 정렬, 집계 모두 가능 - 저장 시
index=False를 습관화합니다 — 불필요한 행 번호 컬럼 제거 - 경로 문제는
os.path기반으로 해결합니다 — 작업 디렉토리에 의존하지 않음
다음으로 알아두면 좋은 것
CSV와 pandas에 익숙해졌다면, 다음 단계로 Excel 파일(.xlsx) 직접 처리(openpyxl), JSON 데이터 다루기, 또는 matplotlib으로 데이터를 그래프로 시각화하는 방향으로 학습을 이어가시길 권장합니다. 데이터를 읽고 가공하는 것에서 한 걸음 더 나아가 시각적으로 표현할 수 있게 되면, 단순한 자동화 스크립트를 넘어 실질적인 데이터 분석 도구를 직접 만들 수 있게 됩니다.
댓글
댓글 쓰기