Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python) csv 모듈 완벽 가이드 – CSV 파일 읽기·쓰기 방법

CSV(Comma Separated Values, 쉼표로 구분된 값)는 스프레드시트에서 가장 널리 사용되는 데이터 형식 중 하나입니다. 파이썬 표준 라이브러리의 csv 모듈은 CSV 파일을 읽고 쓰는 데 필요한 다양한 클래스와 메서드를 제공합니다. 이 글에서는 csv 모듈의 핵심 기능을 예제 코드와 함께 단계별로 살펴보겠습니다.

1. writer() – CSV 파일에 데이터 쓰기

csv 모듈의 writer() 함수는 데이터를 구분자로 구분된 문자열로 변환해 파일 객체에 저장하는 writer 객체를 반환합니다. 이 함수는 쓰기 권한이 있는 파일 객체를 매개변수로 받습니다. 파일에 기록되는 각 행에는 자동으로 줄바꿈 문자가 추가되는데, 줄 사이에 불필요한 빈 줄이 생기는 것을 막으려면 open() 함수 호출 시 newline='' 옵션을 반드시 지정해야 합니다.

writer 클래스의 주요 메서드

  • writerow(): 리스트, 튜플, 문자열 같은 반복 가능한(iterable) 객체의 항목들을 쉼표로 구분해 한 줄로 기록합니다.
  • writerows(): 반복 가능한 객체들의 리스트를 매개변수로 받아, 각 항목을 쉼표로 구분된 한 줄씩 파일에 기록합니다.

다음 예제는 writer 객체를 사용하는 방법을 보여줍니다. 먼저 'w' 모드로 파일을 열고, 이 파일 객체로 writer 객체를 생성한 뒤, 튜플 리스트의 각 요소를 writerow() 메서드로 파일에 기록합니다.

import csv

persons = [('Lata', 22, 45), ('Anil', 21, 56), ('John', 20, 60)]
csvfile = open('persons.csv', 'w', newline='')
obj = csv.writer(csvfile)
for person in persons:
    obj.writerow(person)
csvfile.close()

이 코드를 실행하면 현재 디렉터리에 'persons.csv' 파일이 생성되며, 파일 내용은 다음과 같습니다.

Lata,22,45
Anil,21,56
John,20,60

반복문으로 한 줄씩 기록하는 대신 writerows() 메서드를 사용하면 리스트 전체를 한 번에 기록할 수 있어 코드가 훨씬 간결해집니다.

csvfile = open('persons.csv', 'w', newline='')
obj = csv.writer(csvfile)
obj.writerows(persons)
csvfile.close()

2. reader() – CSV 파일 읽기

csv.reader() 함수는 CSV 파일의 각 줄을 순회하는 reader 객체(이터레이터)를 반환합니다. 일반적인 for 반복문을 사용하면 파일의 모든 줄을 손쉽게 읽어올 수 있습니다.

csvfile = open('persons.csv', 'r', newline='')
obj = csv.reader(csvfile)
for row in obj:
    print(row)
['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']

reader 객체는 이터레이터이므로 내장 함수 next()를 이용해 한 줄씩 가져오는 방식도 가능합니다.

csvfile = open('persons.csv', 'r', newline='')
obj = csv.reader(csvfile)
while True:
    try:
        row = next(obj)
        print(row)
    except StopIteration:
        break

다이얼렉트(Dialect)란?

csv 모듈은 Dialect 클래스도 정의합니다. 다이얼렉트란 CSV 프로토콜을 구현하기 위한 표준 규격의 집합을 의미합니다. 사용 가능한 다이얼렉트 목록은 list_dialects() 함수로 확인할 수 있습니다.

csv.list_dialects()
# ['excel', 'excel-tab', 'unix']

3. DictWriter() – 딕셔너리 데이터 쓰기

DictWriter() 함수는 DictWriter 객체를 반환합니다. writer 객체와 비슷하지만, 각 행이 딕셔너리 객체와 매핑된다는 점이 다릅니다. 이 함수는 쓰기 권한이 있는 파일 객체와 함께, 딕셔너리의 키 목록을 fieldnames 매개변수로 받습니다. fieldnames는 파일의 첫 번째 줄, 즉 헤더(header)를 작성하는 데 사용됩니다.

writeheader()

writeheader() 메서드는 딕셔너리의 키 목록을 쉼표로 구분된 한 줄로 만들어 파일의 첫 번째 줄에 기록합니다.

다음 예제에서는 딕셔너리 항목들의 리스트를 정의하고, writerows() 메서드를 사용해 쉼표로 구분된 형태로 파일에 기록합니다.

persons = [
    {'name': 'Lata', 'age': 22, 'marks': 45},
    {'name': 'Anil', 'age': 21, 'marks': 56},
    {'name': 'John', 'age': 20, 'marks': 60}
]
csvfile = open('persons.csv', 'w', newline='')
fields = list(persons[0].keys())
obj = csv.DictWriter(csvfile, fieldnames=fields)
obj.writeheader()
obj.writerows(persons)
csvfile.close()

생성된 파일의 내용은 다음과 같습니다.

name,age,marks
Lata,22,45
Anil,21,56
John,20,60

4. DictReader() – 딕셔너리 데이터 읽기

DictReader() 함수는 CSV 파일로부터 DictReader 객체를 생성합니다. reader 객체와 마찬가지로 이터레이터이며, 이를 통해 파일 내용을 순서대로 가져올 수 있습니다.

csvfile = open('persons.csv', 'r', newline='')
obj = csv.DictReader(csvfile)

DictReader 클래스는 fieldnames 속성을 제공하며, 이 속성은 파일 헤더로 사용된 딕셔너리 키들을 반환합니다.

obj.fieldnames
# ['name', 'age', 'marks']

DictReader 객체를 반복하면 각 행을 딕셔너리 형태로 얻을 수 있습니다.

for row in obj:
    print(row)
OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])

참고로 파이썬 3.8 이상에서는 DictReader가 일반 dict를 반환하지만, 그 이전 버전에서는 OrderedDict가 반환됩니다. OrderedDict 객체를 일반 딕셔너리로 변환하려면 collections 모듈에서 OrderedDict를 임포트한 후 dict() 함수를 사용하면 됩니다.

from collections import OrderedDict

r = OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
dict(r)
# {'name': 'Lata', 'age': '22', 'marks': '45'}

마무리

이번 글에서는 파이썬 csv 모듈의 핵심 기능인 writer(), reader(), DictWriter(), DictReader()를 살펴봤습니다. 단순한 리스트 형태의 데이터는 writer/reader로, 키-값 구조의 데이터는 DictWriter/DictReader로 처리하면 CSV 파일을 훨씬 효율적으로 다룰 수 있습니다. 실무에서는 with open(...) 구문을 함께 사용해 파일을 자동으로 닫아주는 것이 안전한 코딩 습관이니 참고하세요.