본문 바로가기

Python

5-3. CSV 파일 다루기

파이썬 CSV파일 다루기 타이틀 이미지

 

안녕하세요! 지난 시간에는 파이썬에서 파일에 데이터를 쓰고(write(), writelines()), 파일을 안전하게 다룰 수 있도록 해주는 with 구문에 대해 알아보았습니다. 이제 여러분은 텍스트 파일을 만들고, 내용을 저장하고 불러올 수 있게 되었죠.

이번 시간에는 실생활에서 매우 자주 사용되는 파일 형식 중 하나인 CSV (Comma Separated Values) 파일을 파이썬으로 다루는 방법에 대해 알아보겠습니다. CSV 파일은 데이터를 쉼표(,)로 구분하여 저장하는 텍스트 파일로, 엑셀이나 데이터베이스 간에 데이터를 주고받을 때 널리 사용됩니다.

파이썬은 CSV 파일을 쉽게 읽고 쓸 수 있도록 csv 모듈을 기본으로 제공합니다. 이 모듈을 활용하면 CSV 데이터를 마치 리스트나 딕셔너리처럼 편리하게 다룰 수 있습니다.


Part 1: CSV 파일 읽기 - csv.reader와 csv.DictReader

CSV 파일을 읽는 방법은 크게 두 가지가 있습니다. 일반적인 리더(csv.reader)는 각 행을 리스트로 반환하고, 딕셔너리 리더(csv.DictReader)는 첫 행을 헤더(Header)로 인식하여 각 행을 딕셔너리로 반환합니다.

1. csv.reader - 각 행을 리스트로 읽기

  • csv.reader는 CSV 파일의 각 행을 문자열 리스트로 읽어옵니다.
  • 첫 번째 줄이 헤더인 경우에도 일반 데이터처럼 취급하므로, 직접 처리해야 합니다.

예시: CSV 파일 읽기 (csv_data.csv 파일 먼저 생성)

먼저, 파이썬 스크립트와 같은 폴더에 csv_data.csv라는 파일을 만들고 아래 내용을 저장해주세요.

csv_data.csv 파일 내용:

코드 스니펫
 
이름,나이,도시
김파이,25,서울
이코딩,30,부산
박데이터,22,대전

csv.reader를 이용한 코드:

Python
 
# 파일 이름: read_csv_reader.py
import csv # csv 모듈 임포트

# csv_data.csv 파일이 있다고 가정합니다.
# 내용:
# 이름,나이,도시
# 김파이,25,서울
# 이코딩,30,부산
# 박데이터,22,대전

file_path = "csv_data.csv"

print("--- csv.reader로 파일 읽기 ---")
with open(file_path, 'r', encoding='utf-8') as file:
    csv_reader = csv.reader(file) # csv_reader 객체 생성

    header = next(csv_reader) # 첫 번째 줄 (헤더) 읽기
    print(f"헤더: {header}")

    print("\n--- 데이터 목록 (리스트 형태) ---")
    for row in csv_reader: # 나머지 데이터 행들을 반복
        print(row) # 각 행이 리스트로 출력됨
        # 예: ['김파이', '25', '서울']
        print(f"이름: {row[0]}, 나이: {row[1]}, 도시: {row[2]}")

 

[csv_data.csv 파일 내용]

이름,나이,도시
김파이,25,서울
이코딩,30,부산
박데이터,22,대전

[VS Code 터미널 출력]

파이썬 csv.reader로 CSV 파일 읽기 예시

2. csv.DictReader - 각 행을 딕셔너리로 읽기 (추천!)

  • csv.DictReader는 CSV 파일의 첫 번째 행을 **헤더(Header)**로 자동으로 인식하고, 이후의 각 행을 딕셔너리(Dictionary) 형태로 읽어옵니다. 이 딕셔너리의 키(Key)는 헤더의 값이 되고, 값(Value)은 해당 행의 데이터가 됩니다.
  • 데이터에 이름으로 접근할 수 있어 csv.reader보다 훨씬 편리하고 가독성이 좋습니다.

예시: CSV 파일 읽기 (csv.DictReader 활용)

Python
 
# 파일 이름: read_csv_dictreader.py
import csv

# csv_data.csv 파일이 있다고 가정합니다.
# 내용:
# 이름,나이,도시
# 김파이,25,서울
# 이코딩,30,부산
# 박데이터,22,대전

file_path = "csv_data.csv"

print("--- csv.DictReader로 파일 읽기 ---")
with open(file_path, 'r', encoding='utf-8') as file:
    csv_dict_reader = csv.DictReader(file) # csv_dict_reader 객체 생성

    print(f"헤더 (필드명): {csv_dict_reader.fieldnames}") # DictReader가 인식한 헤더

    print("\n--- 데이터 목록 (딕셔너리 형태) ---")
    for row in csv_dict_reader: # 각 행이 딕셔너리로 출력됨
        print(row) # 예: {'이름': '김파이', '나이': '25', '도시': '서울'}
        print(f"이름: {row['이름']}, 도시: {row['도시']}")

 

[VS Code 터미널 출력]

파이썬 csv.DictReader로 CSV 파일 읽기 예시

Part 2: CSV 파일 쓰기 - csv.writer와 csv.DictWriter

CSV 파일에 데이터를 쓰는 방법도 읽기와 마찬가지로 두 가지가 있습니다.

1. csv.writer - 리스트를 행으로 쓰기

  • csv.writer는 리스트 형태의 데이터를 CSV 파일의 한 행으로 작성합니다.

예시: CSV 파일 쓰기 (csv.writer 활용)

Python
 
# 파일 이름: write_csv_writer.py
import csv

output_file_path = "output_data.csv"

# 헤더와 데이터를 리스트 형태로 준비
header = ['상품명', '가격', '재고']
data = [
    ['노트북', 1200000, 10],
    ['마우스', 25000, 50],
    ['키보드', 70000, 30]
]

print(f"--- {output_file_path} 파일에 데이터 쓰기 (csv.writer) ---")
with open(output_file_path, 'w', newline='', encoding='utf-8') as file:
    csv_writer = csv.writer(file)

    csv_writer.writerow(header) # 헤더 쓰기 (한 행)
    csv_writer.writerows(data) # 여러 행 쓰기

print(f"데이터가 {output_file_path} 파일에 성공적으로 작성되었습니다.")

# 💡 참고: newline=''
# open() 함수에 newline=''를 지정하는 것이 매우 중요합니다.
# 이렇게 하지 않으면 Windows 환경에서 각 줄 사이에 빈 줄이 추가될 수 있습니다.
# 이는 csv 모듈이 줄바꿈을 처리하는 방식과 관련이 있습니다.

 

[VS Code 터미널 출력]

--- output_data.csv 파일에 데이터 쓰기 (csv.writer) ---
데이터가 output_data.csv 파일에 성공적으로 작성되었습니다.

[VS Code 탐색기에서 'output_data.csv'를 열었을 때의 내용]

파이썬 csv.writer로 CSV 파일 쓰기 예시

2. csv.DictWriter - 딕셔너리를 행으로 쓰기 (추천!)

  • csv.DictWriter는 딕셔너리 형태의 데이터를 CSV 파일의 한 행으로 작성합니다. 이때, 첫 번째 인자로 필드명(fieldnames) 리스트를 제공하여 CSV 헤더의 순서와 딕셔너리의 키를 매핑해야 합니다.

예시: CSV 파일 쓰기 (csv.DictWriter 활용)

Python
 
# 파일 이름: write_csv_dictwriter.py
import csv

output_dict_file_path = "output_dict_data.csv"

# 필드명 (헤더) 정의
fieldnames = ['이름', '과목', '점수']

# 데이터를 딕셔너리 리스트 형태로 준비
students_grades = [
    {'이름': '김영희', '과목': '수학', '점수': 95},
    {'이름': '박찬호', '과목': '영어', '점수': 88},
    {'이름': '최수정', '과목': '국어', '점수': 92}
]

print(f"--- {output_dict_file_path} 파일에 데이터 쓰기 (csv.DictWriter) ---")
with open(output_dict_file_path, 'w', newline='', encoding='utf-8') as file:
    csv_dict_writer = csv.DictWriter(file, fieldnames=fieldnames)

    csv_dict_writer.writeheader() # 헤더 쓰기
    csv_dict_writer.writerows(students_grades) # 데이터 쓰기

print(f"데이터가 {output_dict_file_path} 파일에 성공적으로 작성되었습니다.")

 

[VS Code 터미널 출력]

--- output_dict_data.csv 파일에 데이터 쓰기 (csv.DictWriter) ---
데이터가 output_dict_data.csv 파일에 성공적으로 작성되었습니다.

[VS Code 탐색기에서 'output_dict_data.csv'를 열었을 때의 내용]

파이썬 csv.DictWriter로 CSV 파일 쓰기 예시


Part 3: CSV 파일 다루기 팁

  • encoding='utf-8': 한글이 포함된 CSV 파일을 다룰 때는 open() 함수에 encoding='utf-8'을 지정하는 것이 매우 중요합니다. 그렇지 않으면 인코딩 오류가 발생할 수 있습니다.
  • newline='': CSV 파일을 쓰고 읽을 때 open() 함수에 newline=''를 지정하는 것이 좋습니다. 이를 생략하면 Windows 환경에서 줄바꿈 문제가 발생하여 각 행 사이에 빈 줄이 생길 수 있습니다.
  • 파일 존재 여부 확인: CSV 파일을 읽기 전에 파일이 존재하는지 확인하는 것이 좋습니다. (os 모듈의 os.path.exists() 함수를 사용하거나, 다음 포스팅에서 배울 예외 처리를 활용할 수 있습니다.)

마무리하며

이번 시간에는 파이썬의 csv 모듈을 사용하여 CSV 파일을 읽고 쓰는 방법에 대해 자세히 알아보았습니다.

  • 읽기:
    • csv.reader: 각 행을 리스트로.
    • csv.DictReader: 첫 행을 헤더로 삼아 각 행을 딕셔너리로 (더 편리함).
  • 쓰기:
    • csv.writer: 리스트 형태의 데이터를 행으로.
    • csv.DictWriter: 딕셔너리 형태의 데이터를 행으로 (필드명 지정 필수, 더 편리함).

특히 encoding='utf-8'과 newline='' 옵션의 중요성도 함께 강조했습니다. 이제 여러분은 대량의 테이블 형태 데이터를 효과적으로 다루는 CSV 파일을 프로그램과 연동할 수 있게 되었습니다!

다음 포스팅에서는 프로그램 실행 중 발생하는 예상치 못한 오류를 우아하게 처리하여 프로그램이 강제로 종료되는 것을 막는 **예외 처리(try-except 구문)**에 대해 자세히 알아보겠습니다.


궁금한 점이 있다면 언제든지 질문해주세요! 다음 포스팅에서 만나요!

반응형

'Python' 카테고리의 다른 글

5-5. raise와 사용자 정의 예외  (0) 2025.06.29
5-4. 예외 처리 try-except 구문  (0) 2025.06.28
5-2. 파일 쓰기(write, with 구문)  (0) 2025.06.27
4-6. 재귀 함수 이해하기  (0) 2025.06.27
4-5. 지역변수 vs 전역변수  (0) 2025.06.26