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

Python CSV 모듈 완벽 가이드: 단계별로 배우는 CSV 파일 읽기와 쓰기

파이썬(Python)의 csv 모듈은 CSV 파일을 손쉽게 다룰 수 있도록 도와주는 표준 라이브러리입니다. CSV 파일은 방대한 양의 데이터를 저장할 수 있으며, csv 모듈의 reader()writer() 함수를 활용하면 파이썬으로 이러한 파일을 자유롭게 읽고 쓸 수 있습니다.


데이터를 읽고, 쓰고, 가공하는 작업은 프로그래밍에서 필수적인 요소입니다. 따라서 파이썬에서 파일을 다루는 방법을 알아두면 외부 소스로부터 데이터를 가져오거나 저장할 때 큰 도움이 됩니다.

예를 들어, 여러분이 동네 아이스크림 가게 사장이라고 가정해 봅시다. 고객의 소비 패턴을 파악하고 싶다면, 지금까지 수집한 주문 데이터를 파이썬으로 분석하여 어떤 맛의 아이스크림이 인기가 있는지, 고객들이 그 맛에 얼마나 지출하는지 등을 알아낼 수 있습니다.

바로 이럴 때 파이썬 CSV 모듈이 유용합니다. CSV 파일은 대량의 데이터를 저장하는 데 널리 사용되며, CSV 모듈을 사용하면 파이썬 프로그램 안에서 해당 파일을 손쉽게 파싱(parsing)할 수 있습니다. 이번 튜토리얼에서는 파이썬 CSV 모듈을 사용해 CSV 파일을 읽고 쓰는 방법을 자세히 살펴보겠습니다.

CSV 파일이란?

데이터를 다룰 때 각 값이 쉼표(,)로 구분된 목록 형태를 접하게 됩니다. 예를 들어 아이스크림 주문 목록에서 각 값이 쉼표로 구분되어 있다면, 이러한 데이터 구조를 CSV(Comma-Separated Values, 쉼표로 구분된 값) 데이터라고 부릅니다.

일반 텍스트 파일은 단순히 데이터를 저장하는 용도로는 유용하지만, 구조화된 데이터를 저장하기에는 적합하지 않습니다. 반면 CSV 파일은 스프레드시트나 데이터베이스처럼 표(table) 형태로 구조화된 데이터를 저장할 수 있어, 코드에서 각 값을 참조하기가 매우 편리합니다. 예를 들어 아이스크림 맛 목록이나 공급업체 정보를 CSV 파일에 저장할 수 있습니다.

다음은 CSV 파일의 한 예입니다.

suppliers.csv
Hendersons Creamery, 123 Main Street, Cream
Peterson Chocolate, 129 Second Street, Chocolate Sprinkles

이 파일에는 세 가지 정보가 담겨 있습니다. 공급업체의 이름, 주소, 그리고 우리 업장에 공급하는 제품입니다. 또한 파일에는 두 줄의 데이터가 저장되어 있으며, 각각 Hendersons Creamery와 Peterson Chocolate에 대한 정보입니다.

이처럼 데이터가 CSV 파일로 구조화되어 있으면, 파이썬 프로그램으로 파일을 파싱하여 개별 열(column)이나 행(row)의 데이터를 추출할 수 있습니다.

파이썬 CSV 모듈 기본 사용법

파이썬 CSV 모듈은 CSV 데이터를 파싱하는 데 사용됩니다. 예를 들어 공급업체 정보가 담긴 CSV 파일이 있다면, CSV 모듈을 통해 해당 데이터를 불러와 원하는 작업을 수행할 수 있습니다.

CSV는 파이썬에 내장된 모듈이지만, 사용하기 전에 먼저 프로그램으로 임포트(import)해야 합니다. 다음 코드로 간단히 임포트할 수 있습니다.

import csv

CSV 파일 읽기

CSV 파일의 데이터를 다루려면 먼저 파일을 읽어야 합니다. CSV 모듈에는 reader()라는 메서드가 포함되어 있으며, 이를 사용해 CSV 파일의 내용을 프로그램으로 불러올 수 있습니다. reader 함수는 지정된 파일의 각 줄을 읽어 열(column)들의 리스트로 변환합니다.

예를 들어, suppliers.csv라는 파일에 아이스크림 공급업체 목록이 저장되어 있다고 가정해 보겠습니다. 파일의 내용은 다음과 같습니다.

Hendersons Creamery, 123 Main Street, Cream
Peterson Chocolate, 129 Second Street, Chocolate Sprinkles
HW Smith and Co, 17 Boston Avenue, Ice Cream Cones

이 데이터는 다음 코드로 불러올 수 있습니다.

import csv
with open("suppliers.csv", "r") as f:
    contents = csv.reader(f)
    for c in contents:
        print(c)

코드가 다소 길어 보이니 하나씩 살펴보겠습니다. 첫 번째 줄에서는 csv 모듈을 임포트하여 코드에서 CSV 관련 메서드를 사용할 수 있게 합니다. 다음 줄에서는 with 문을 사용해 파일을 열고, 열린 파일 객체를 변수 f에 할당합니다.

그다음 contents = csv.reader(f)를 통해 csv.reader() 함수로 파일 내용을 읽어 들입니다. 마지막으로 for 루프를 사용해 CSV 파일의 각 줄을 순회하며 파이썬 셸에 출력합니다.

프로그램 실행 결과는 다음과 같습니다.

['Hendersons Creamery', ' 123 Main Street', ' Cream']
['Peterson Chocolate', ' 129 Second Street', ' Chocolate Sprinkles']
['HW Smith and Co', ' 17 Boston Avenue', ' Ice Cream Cones']

출력 결과를 보면 프로그램이 파일의 내용을 읽어 각 줄을 배열(array)로 변환한 것을 확인할 수 있습니다. 이제 이 데이터를 프로그램 안에서 자유롭게 가공할 수 있습니다.

예를 들어, 가게 문을 닫는 관계로 다음 주 주문을 취소하는 통지문을 보내야 한다고 가정해 봅시다. 각 공급업체의 주소를 추출하려면 다음 코드를 사용할 수 있습니다.

...
    for c in contents:
        print(c[1])

실행 결과는 다음과 같습니다.

123 Main Street
129 Second Street
17 Boston Avenue

위 코드에서는 contents 변수의 각 줄을 순회하는 for 루프를 만들고, 인덱스 번호 1에 해당하는 값을 출력합니다. 이 경우 인덱스 1에는 각 공급업체의 주소가 저장되어 있습니다.

이번에는 파일의 데이터를 배열로 읽어 들여 보겠습니다. 데이터를 다른 변수에 저장해 두면 나중에 재사용할 수 있어 매우 일반적으로 활용되는 방식입니다. 다음 코드를 사용하면 됩니다.

import csv

suppliers = []

with open("suppliers.csv", "r") as f:
    contents = csv.reader(f)
    for c in contents:
        suppliers.append(c)

print(suppliers)

실행 결과는 다음과 같습니다.

[['Hendersons Creamery', ' 123 Main Street', ' Cream'], ['Peterson Chocolate', ' 129 Second Street', ' Chocolate Sprinkles'], ['HW Smith and Co', ' 17 Boston Avenue', ' Ice Cream Cones']]

코드의 흐름을 설명하자면, 프로그램이 suppliers.csv 파일을 열고 내용을 읽은 후, 각 레코드를 프로그램 시작 부분에서 선언한 suppliers 배열에 추가(append)합니다. 그런 다음 suppliers 변수를 출력합니다.

CSV 파일 쓰기

CSV 모듈에는 데이터를 CSV 파일에 기록하는 writer() 메서드도 포함되어 있습니다. writer() 함수를 사용하면 지정한 파일에 데이터를 저장하여 나중에 다시 활용할 수 있습니다.

writer() 함수는 파일에 데이터를 쓰기 위한 객체를 생성하며, 실제로 데이터를 기록할 때는 writerow() 메서드를 사용합니다.

예를 들어, 각 공급업체 레코드에 새로운 값을 추가하는 프로그램을 작성했다고 가정해 봅시다. 이 값은 해당 공급업체가 특정 제품의 주요 공급업체인지 여부를 나타냅니다. 다음 코드를 사용해 기존 데이터를 파일에 기록할 수 있습니다.

import csv

suppliers = []

with open("suppliers.csv", "r") as f:
    contents = csv.reader(f)
    for c in contents:
        c.append("Yes")
        suppliers.append(c)

with open("new_suppliers.csv", "w") as f:
    write_to_file = csv.writer(f)
    for s in suppliers:
        write_to_file.writerow(s)

코드의 앞부분은 앞선 예제와 거의 동일합니다. suppliers.csv 파일을 읽어 그 내용을 suppliers 배열로 옮깁니다. 차이점이 있다면, 읽는 과정에서 각 항목에 Yes라는 새로운 값을 추가한다는 것입니다. 이 값은 해당 공급업체가 특정 제품의 주요 공급업체인지 여부를 나타냅니다.

그다음 new_suppliers.csv라는 새 파일을 열고, suppliers의 내용을 해당 파일에 기록합니다. 이때 writer() 함수를 사용해 파일을 쓰기 가능한 상태로 준비합니다.

마지막으로 for 루프를 통해 suppliers 배열을 순회하면서 writerow() 메서드로 각 공급업체 정보를 new_suppliers.csv 파일에 추가합니다.

실행 결과는 다음과 같습니다.

new_suppliers.csv
Hendersons Creamery, 123 Main Street, Cream,Yes
Peterson Chocolate, 129 Second Street, Chocolate Sprinkles,Yes
HW Smith and Co, 17 Boston Avenue, Ice Cream Cones,Yes

그런데 suppliers 변수 전체를 파일에 기록하고 싶다면 굳이 각 항목을 하나씩 순회할 필요가 없습니다. 대신 writerows() 메서드를 사용하면 suppliers 변수의 모든 항목을 한 번에 new_suppliers.csv 파일에 기록할 수 있습니다.

사용 코드는 다음과 같습니다.

...
    write_to_file = csv.writer(f)
    write_to_file.writerows(suppliers)

...

실행 결과는 동일합니다.

new_suppliers.csv
Hendersons Creamery, 123 Main Street, Cream,Yes
Peterson Chocolate, 129 Second Street, Chocolate Sprinkles,Yes
HW Smith and Co, 17 Boston Avenue, Ice Cream Cones,Yes

CSV 파일 따옴표(Quoting) 처리

앞선 예제에서는 코드가 suppliers 배열의 내용을 그대로 새 파일에 기록했습니다.

하지만 때로는 각 값을 따옴표로 감싸서 파일에 기록해야 할 경우도 있습니다. 예를 들어 공급업체 이름에 쉼표가 포함되어 있다면, 따옴표 처리 없이는 CSV 파일의 구조가 깨져버릴(malformed) 수 있습니다.

CSV 모듈에는 기록되는 값을 따옴표로 감싸는 네 가지 quoting 옵션이 있으며, 이를 통해 위와 같은 문제를 방지할 수 있습니다. 이 옵션들은 csv.writer() 메서드에 인수로 전달되며, 종류는 다음과 같습니다.

  • csv.QUOTE_ALL: 모든 문자열을 따옴표로 감쌈
  • csv.QUOTE_NONNUMERIC: 모든 문자열 필드를 따옴표로 감쌈
  • csv.QUOTE_MINIMAL: 특수 문자가 포함된 필드만 따옴표로 감쌈
  • csv.QUOTE_NONE: 어떤 값도 따옴표로 감싸지 않음

예를 들어, suppliers 배열의 모든 값을 파일에 기록할 때 따옴표로 감싸고 싶다면 다음 코드를 사용하면 됩니다.

...

write_to_file = csv.writer(f, quoting=csv.QUOTE_ALL)

...

이제 프로그램을 실행하면 new_suppliers.csv 파일에는 다음과 같은 내용이 저장됩니다.

"Hendersons Creamery"," 123 Main Street"," Cream","Yes"
"Peterson Chocolate"," 129 Second Street"," Chocolate Sprinkles","Yes"
"HW Smith and Co"," 17 Boston Avenue"," Ice Cream Cones","Yes"

마무리

파일에서 데이터를 읽고 파일에 데이터를 쓰면, 파이썬 프로그램이 생성한 데이터를 자유롭게 불러오고 저장할 수 있습니다. 예를 들어 아이스크림 맛과 가격이 담긴 메뉴를 파이썬 프로그램에서 활용하고 싶다면, 해당 데이터를 파일로 저장해 두는 것이 좋습니다.

이번 튜토리얼에서는 파이썬 CSV 모듈의 기본 개념과 작동 방식을 살펴보았습니다. 또한 reader()writer() 객체를 사용해 파일을 읽고 쓰는 방법도 함께 알아보았습니다.

이제 여러분도 프로처럼 파이썬으로 CSV 파일에서 데이터를 읽고, CSV 파일에 데이터를 쓸 준비가 되었습니다!