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

파이썬으로 CSV 파일 읽고 쓰기 완벽 가이드: csv 모듈과 Pandas 활용법

이 글에서는 파이썬에서 CSV 파일을 읽고 쓰는 방법을 알아봅니다. 기본 내장 모듈인 csv와 데이터 분석에 널리 쓰이는 Pandas 라이브러리를 활용한 예제를 다룹니다.

csv 모듈로 CSV 파일 읽기

가장 기본적인 방법은 파이썬에 내장된 csv 모듈을 사용하는 것입니다. 아래 예제는 orders.csv 파일을 읽어 각 행을 순서대로 출력합니다.

import csv

f = open("orders.csv", "rt")
orders = csv.reader(f)
for order in orders:
    print(order)
f.close()

위 코드의 실행 결과는 다음과 같습니다. 각 행은 리스트(list) 형태로 반환됩니다.

['OrderID', 'CustomerID', 'OrderDate']
['10248', '4', '10/02/2020']
['10249', '2', '10/02/2020']
['10250', '7', '10/02/2020']

💡 팁: with open(...) 구문을 사용하면 파일을 자동으로 닫아주므로 f.close()를 직접 호출할 필요가 없어 더 안전한 코드 작성이 가능합니다.

DictReader로 딕셔너리 형태로 CSV 읽기

DictReader 메서드를 사용하면 CSV 파일의 각 행을 딕셔너리(dictionary) 형태로 읽을 수 있습니다. 이때 첫 번째 행의 컬럼 헤더가 키(key)로 사용되므로, 컬럼 이름으로 값에 접근할 수 있어 코드의 가독성이 크게 향상됩니다.

import csv

orders = csv.DictReader(open("orders.csv"))
for order in orders:
    print(order)

실행 결과:

{'OrderID': '10248', 'CustomerID': '4', 'OrderDate': '10/02/2020'}
{'OrderID': '10249', 'CustomerID': '2', 'OrderDate': '10/02/2020'}
{'OrderID': '10250', 'CustomerID': '7', 'OrderDate': '10/02/2020'}

Pandas로 CSV 파일 읽기

대량의 데이터를 다루거나 데이터 분석 작업을 수행하려면 Pandas가 훨씬 편리합니다. 먼저 Pandas 라이브러리를 설치해야 합니다.

설치 명령어: pip3 install pandas

import pandas

orders = pandas.read_csv('orders.csv')
print(orders)

실행 결과는 DataFrame 형태로 깔끔하게 출력됩니다.

OrderID  CustomerID   OrderDate
10248           4     10/02/2020
10249           2     10/02/2020
10250           7     10/02/2020

Pandas로 CSV 파일 쓰기

Pandas에서는 DataFrame 객체를 생성한 후 to_csv() 메서드를 호출하여 손쉽게 CSV 파일을 저장할 수 있습니다. index=False 옵션을 지정하면 불필요한 인덱스 열이 파일에 포함되지 않습니다.

from pandas import DataFrame
import pandas as pd

order = pd.DataFrame({'OrderID': ['10251', '10252', '10253'],
                   'CustomerID': ['5', '1', '8'],
                   'OrderDate': ['11/02/2020', '11/02/2020', '11/02/2020']})
order.to_csv('newOrders.csv', index=False)

생성된 newOrders.csv 파일의 내용:

OrderID,CustomerID,OrderDate
10251,5,11/02/2020
10252,1,11/02/2020
10253,8,11/02/2020

기존 CSV 파일에 데이터 추가하기

파일 쓰기의 기본 모드는 'w'(덮어쓰기)입니다. 따라서 기존 CSV 파일에 새로운 데이터를 추가하려면 반드시 추가 모드인 mode='a'를 지정해야 합니다. 또한 헤더가 중복 저장되지 않도록 header=False 옵션도 함께 설정하는 것이 좋습니다.

from pandas import DataFrame
import pandas as pd

order = pd.DataFrame({'OrderID': ['10254'],
                   'CustomerID': ['3'],
                   'OrderDate': ['11/02/2020']})
order.to_csv('newOrders.csv', mode='a', index=False, header=False)

데이터 추가 후 newOrders.csv 파일의 내용:

OrderID,CustomerID,OrderDate
10251,5,11/02/2020
10252,1,11/02/2020
10253,8,11/02/2020
10254,3,11/02/2020

csv 모듈로 CSV 파일 쓰기

csv.writer를 사용하면 행 단위로 데이터를 직접 작성할 수 있습니다. 참고로 첫 번째로 작성하는 행은 일반적으로 컬럼 헤더로 사용합니다.

import csv
with open('orders.csv', 'w', newline='') as file:
    order = csv.writer(file)
    order.writerow(['OrderID', 'CustomerID', 'OrderDate'])
    order.writerow(['10251', '6', '11/02/2020'])
    order.writerow(['10252', '9', '11/02/2020'])
    order.writerow(['10253', '5', '11/02/2020'])

생성된 orders.csv 파일의 내용:

OrderID,CustomerID,OrderDate
10251,6,11/02/2020
10252,9,11/02/2020
10253,5,11/02/2020

csv 모듈로 기존 파일에 데이터를 추가하려면 open() 메서드에 'a' 모드를 전달하고, 헤더가 이미 존재하므로 헤더 행은 생략하고 데이터만 작성하면 됩니다.

with open('orders.csv', 'a', newline='') as file:
    order = csv.writer(file)
    order.writerow(['10251', '6', '11/02/2020'])

DictWriter로 CSV 파일 쓰기

csv.DictWriter를 사용하면 딕셔너리 형태의 데이터를 CSV 파일로 저장할 수 있습니다. 필드명(fieldnames)을 미리 정의하고 writeheader()로 헤더를 작성한 후, 각 행을 딕셔너리로 전달하면 됩니다.

import csv
with open('orders.csv', 'w', newline='') as file:
    fieldnames = ['OrderID', 'CustomerID', 'OrderDate']
    order = csv.DictWriter(file, fieldnames=fieldnames)
    order.writeheader()
    order.writerow({'OrderID': '10251', 'CustomerID': 7, 'OrderDate': '11/02/2020'})
    order.writerow({'OrderID': '10252', 'CustomerID': 3, 'OrderDate': '11/02/2020'})
    order.writerow({'OrderID': '10253', 'CustomerID': 1, 'OrderDate': '11/02/2020'})

생성된 orders.csv 파일의 내용:

OrderID,CustomerID,OrderDate
10251,7,11/02/2020
10252,3,11/02/2020
10253,1,11/02/2020

마무리 정리

  • 간단한 파일 처리: 내장 csv 모듈만으로 충분하며 별도 설치가 필요 없습니다.
  • 키-값 접근이 필요할 때: DictReader / DictWriter를 사용하면 컬럼 이름으로 데이터를 다룰 수 있습니다.
  • 데이터 분석 및 대용량 처리: Pandas의 read_csv()to_csv()가 가장 강력하고 편리합니다.
  • 데이터 추가 시 주의사항: 항상 'a'(append) 모드를 사용하고, 헤더 중복 여부를 확인하세요.