우와한 개발자

[Python] CSV 파일 읽고 쓰기 - csv.reader, DictReader, DictWriter

by 우와한개발자

[ CSV 파일 읽고 쓰기 ]

1. CSV 파일이란?

  • CSV(Comma Separated Values) : 스프레드시트나 데이터베이스를 가져오거나 내보낼 때 가장 많이 사용하는 형식
  • 일반적으로 쉼표(,)로 구분하나 간혹 세미콜론(;)으로 구분된 경우도 있음
  • 문자열은 쌍따옴표로 묶여있는 경우가 많음
  • 파이썬 기본 라이브러리에 csv 모듈이 포함되어 있으나 요즘은 주로 판다스(Pandas)를 사용

 

2. CSV 읽기

1) csv.reader()

  • 지정된 파일에서 행 단위로 데이터를 읽어 리스트로 반환
import csv

with open('data.csv', 'r') as f:
    reader = csv.reader(f, quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
    for row in reader:
        print(row)
  • quotechar : 문자열을 묶는 따옴표 기호 지정
  • quoting=csv.QUOTE_NONNUMERIC : 따옴표로 묶이지 않은 값은 숫자(float)로 변환하여 읽음

 

2)csv.DictReader()

  • 첫 번째 행을 키(메타정보)로 사용하여 각 행을 딕셔너리로 반환
with open('data.csv', 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row)  # {'name': '홍길동', 'age': '30'}
  • fieldnames : 헤더 행이 없는 경우 직접 필드명 지정
  • restkey : 필드 수보다 데이터가 많은 경우 남는 데이터를 지정한 키에 리스트로 저장
# CSV 내용
# name, age
# 홍길동, 30, 서울, 개발자   ← 필드(2개)보다 데이터(4개)가 많은 경우

with open('data.csv', 'r') as f:
    reader = csv.DictReader(f, restkey='extra')
    for row in reader:
        print(row)
# {'name': '홍길동', 'age': '30', 'extra': ['서울', '개발자']}
  • restval : 필드 수보다 데이터가 적은 경우 빈 값의 기본값 지정
# CSV 내용
# name, age, address
# 홍길동, 30            ← 필드(3개)보다 데이터(2개)가 적은 경우

with open('data.csv', 'r') as f:
    reader = csv.DictReader(f, restval='없음')
    for row in reader:
        print(row)
# {'name': '홍길동', 'age': '30', 'address': '없음'}

 

3. CSV 쓰기

1) csv.writer()

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['name', 'age'])   # 단일 행 쓰기
    writer.writerows([['홍길동', 30], ['김철수', 25]])  # 여러 행 쓰기

 

2) csv.DictWriter()

  • 딕셔너리 데이터를 행별로 CSV에 저장
with open('output.csv', 'w', newline='') as f:
    fieldnames = ['name', 'age']
    writer = csv.DictWriter(f, fieldnames=fieldnames, extrasaction='ignore')
    writer.writeheader()
    writer.writerow({'name': '홍길동', 'age': 30})           # 단일 행
    writer.writerows([{'name': '김철수', 'age': 25}, ...])   # 여러 행
  • DictWriter는 저장할 컬럼을 fieldnames 로 미리 지정해두는데, 딕셔너리에 fieldnames에 없는 키가 있으면 기본적으로 에러가 발생
  • extrasaction='ignore' : fieldnames에 없는 키가 있어도 예외 발생 없이 무시

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기