파이썬으로 CSV 파일을 다뤄야 하는 이유
업무를 하다 보면 엑셀이나 데이터베이스에서 추출한 CSV 파일을 매일 마주하게 됩니다. 하지만 이 파일들은 늘 정돈되어 있지 않습니다. 공백이 포함되어 있거나, 누락된 데이터가 있거나, 날짜 형식이 제각각인 경우가 많습니다. 이 글에서는 외부 라이브러리 설치 없이 파이썬 표준 라이브러리인 csv와 datetime 등을 활용해, 지저분한 CSV 파일을 자동으로 정리하고 표준화하는 실무형 스크립트 작성 방법을 살펴봅니다.
[목차]
이 글을 끝까지 읽으시면 불필요한 공백 제거, 빈 값 처리, 그리고 날짜 포맷 통일을 자동으로 처리하는 파이썬 코드를 직접 작성하고 자신의 업무에 바로 적용할 수 있게 됩니다.
실무에서 마주하는 지저분한 데이터의 문제점
데이터 분석이나 보고서 작성을 위해 CSV 파일을 불러올 때 가장 흔하게 발생하는 문제는 다음과 같습니다. 문자열 앞뒤에 보이지 않는 공백이 있어 정확한 그룹화가 안 되거나, 값이 비어 있어서 프로그램이 멈추는 현상입니다. 또한 작성자마다 제각각 입력한 날짜 데이터는 시계열 분석을 불가능하게 만듭니다.
수동으로 엑셀을 열어 셀 하나하나를 수정하는 것은 데이터 양이 늘어날수록 시간 낭비일 뿐만 아니라 휴먼 에러를 유발합니다. 파이썬 스크립트를 통해 이를 자동화하면 반복 업무를 줄이고 일관된 품질의 정제된 데이터를 얻을 수 있습니다.
csv 모듈을 활용한 기본 읽기 및 쓰기 구조
파이썬은 기본적으로 CSV 파일을 다루기 위한 csv 표준 라이브러리를 제공합니다. 별도의 설치 과정 없이 import csv를 통해 바로 사용할 수 있습니다. 파일을 열 때는 인코딩 문제(주로 한글 윈도우 환경의 cp949와 utf-8 충돌)를 방지하기 위해 encoding='utf-8-sig'를 지정하는 것이 안전합니다.
기본적인 파일 처리 흐름은 원본 파일을 읽기 모드로 열고, 데이터를 순회하며 정제한 뒤, 새로운 결과 파일에 쓰기 모드로 저장하는 방식으로 구성됩니다.
실전 CSV 자동 정제 스크립트 예제
아래 코드는 실제로 업무에서 자주 발생하는 세 가지 문제(공백 제거, 결측치 대체, 날짜 포맷 통일)를 한 번에 처리하는 예제 스크립트입니다.
import csv
from datetime import datetime
def clean_csv_data(input_filename, output_filename):
cleaned_rows = []
# 원본 파일 읽기
with open(input_filename, mode='r', encoding='utf-8-sig') as infile:
reader = csv.DictReader(infile)
fieldnames = reader.fieldnames
for row in reader:
# 1. 모든 필드 값의 앞뒤 공백 제거
cleaned_row = {key: (value.strip() if value else "") for key, value in row.items()}
# 2. 결측치(빈 값) 처리: 특정 컬럼이 비어있으면 'N/A'로 대체
if not cleaned_row.get('Category'):
cleaned_row['Category'] = 'N/A'
# 3. 날짜 형식 표준화 (예: YYYY-MM-DD 형태로 변환)
date_str = cleaned_row.get('Date')
if date_str:
try:
# 다양한 포맷으로 들어온 날짜를 파싱 후 표준 포맷으로 변환
parsed_date = datetime.strptime(date_str, '%Y/%m/%d')
cleaned_row['Date'] = parsed_date.strftime('%Y-%m-%d')
except ValueError:
# 형식이 맞지 않는 경우 원본 유지 또는 기본값 설정
pass
cleaned_rows.append(cleaned_row)
# 정제된 데이터 새로운 파일로 저장
with open(output_filename, mode='w', encoding='utf-8-sig', newline='') as outfile:
writer = csv.DictWriter(outfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(cleaned_rows)
print(f"파일 정리가 완료되었습니다. 저장된 파일: {output_filename}")
if __name__ == '__main__':
clean_csv_data('raw_data.csv', 'cleaned_data.csv')
코드 동작 방식 상세 해설
위 스크립트는 DictReader를 사용하여 각 행을 딕셔너리 형태로 읽어옵니다. 이를 통해 컬럼 인덱스 번호 대신 컬럼 이름을 직접 키로 사용할 수 있어 가독성이 높아지고 유지보수가 편리해집니다.
- 공백 제거:
value.strip()을 통해 셀 데이터 양끝에 붙은 보이지 않는 공백을 제거합니다. - 결측치 처리: 값이 존재하지 않는 경우 빈 문자열 상태로 두지 않고
'N/A'와 같은 기본값으로 채워 후속 작업에서의 에러를 예방합니다. - 날짜 포맷 정규화:
strptime과strftime조합을 통해 서로 다른 형태로 입력된 날짜 문자열을 일관된 시스템 표준형으로 맞춥니다.
작업 효율을 높이는 실무 체크리스트
CSV 정제 스크립트를 작성하고 실행할 때 반드시 점검해야 할 항목들을 정리했습니다.
- 인코딩 확인: 한글이 깨지는 현상이 발생한다면 읽기와 쓰기 모두에
encoding='utf-8-sig'가 올바르게 지정되었는지 확인했는가? - 헤더 존재 여부: 첫 번째 행이 데이터가 아니라 컬럼 이름(헤더)인지 확인하고
DictReader가 올바르게 인식하고 있는가? - 줄바꿈 처리: 윈도우 환경에서 저장할 때 빈 행이 추가로 생기는 것을 막기 위해
outfile오픈 시newline=''옵션을 추가했는가? - 예외 처리: 날짜 파싱이나 숫자 변환 시 잘못된 데이터로 인해 스크립트가 중단되지 않도록
try-except구문이 적절히 배치되었는가?
초보자들이 자주 범하는 실수
CSV 정제 코드를 처음 작성할 때 흔히 겪는 시행착오와 해결 방법입니다.
| 구분 | 흔한 실수 | 올바른 대처 방법 |
|---|---|---|
| 인코딩 오류 | 기본 open() 함수 사용으로 한글 깨짐 발생 | 항상 encoding='utf-8-sig'를 명시하여 엑셀 호환성을 높입니다. |
| 원본 덮어쓰기 | 원본 raw 파일에 직접 정제 결과를 덮어써서 데이터 유실 | 반드시 새로운 파일 이름(예: cleaned_data.csv)으로 결과를 저장합니다. |
| 불필요한 공백 방치 | 키 값에 공백이 남아 딕셔너리 매칭 실패 | 데이터뿐만 아니라 컬럼 헤더 이름에도 strip()을 적용하는지 확인합니다. |
마무리하며
파이썬의 기본 csv 모듈과 간단한 제어문을 활용하면 반복적이고 지루한 데이터 전처리 업무를 단 몇 초 만에 끝낼 수 있습니다. 오늘 다룬 예제를 바탕으로 자신의 업무 환경에 맞는 규칙들을 하나씩 추가해 나간다면, 데이터 관리의 정확성과 속도를 모두 크게 향상시킬 수 있을 것입니다.