파이썬에서 기본 모듈 `csv`을 이용해 `csv` 형식 파일로 자료를 저장하기

pandas(이하 판다스)를 이용하면 숫자를 다루는 것이 편하지만, 판다스를 설치할 수 없는 환경에 있거나 굳이 판다스까지 설치할 필요가 없지만, 자료를 csv 형식으로 저장해야할 때가 있습니다. 이때를 대비하여 파이썬이 가지고 있는 기본 모듈로 csv파일을 저장해 봅시다. 가장 단순 한 자료부터 시작해 봅시다. 우선 저장할 자료를 만들어봅시다.

a = [['20200906', 'NCSS1'],['20201028', 'HHLG0']]

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

>>> a
[['20200906', 'NCSS1'], ['20201028', 'HHLG0']]

a의 자료 구조는 아주 단순합니다. 2개의 원소를 가진 list를 가지고 있는 list입니다. 각 list 모두 첫 번째는 숫자로 두 번째는 문자열을 가지고 있습니다. csv 파일에서 숫자로 되어 있는 부분은 첫 번째 컬럼에 들어 가고 두번째 문자열로 되어 있는 부분은 두 번재 컬럼에 들어갈 것입니다. 그러면 저장해 봅시다.

import csv

with open("out.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(a)

여기서 살펴봐야 하는 부분은 writer.writerows(a)입니다. a를 한 줄씩 파일에 저장하고 있는 것을 확인할 수 있습니다. out.csv 파일을 확인해 보면, 다음과 같이 저장된 것을 확인할 수 있습니다.

20200906,NCSS1
20201028,HHLG0

앞에서 저장한 a 자료에는 컬럼 이름이 없었습니다. 이번에는 컬럼 이름을 가지고 있는 자료를 저장해 봅시다. 저장할 자료를 하나 만들겠습니다.

data = [
    {"ID": "A1", "X1": 1, "X2": 3.0},
    {"ID": "A2", "X1": 2, "X2": 4.5},
    {"ID": "A3", "X1": 3, "X2": 3.2},
    {"ID": "A4", "X1": 4, "X2": 4.0},
    {"ID": "A5", "X1": 5, "X2": 3.5},
]

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

>>> data = [
...     {"ID": "A1", "X1": 1, "X2": 3.0},
...     {"ID": "A2", "X1": 2, "X2": 4.5},
...     {"ID": "A3", "X1": 3, "X2": 3.2},
...     {"ID": "A4", "X1": 4, "X2": 4.0},
...     {"ID": "A5", "X1": 5, "X2": 3.5},
... ]

이 자료는 앞에서 저장했던 a와 자료 구조가 전혀 다릅니다. data는 4개의 dict를 가지고 있는 list입니다. 모든 dict는 같은 키, 'ID', 'X1', 'X2'를 가지고 있고 가지고 있는 값 또한 같은 형식입니다. 여기서 'ID', 'X1', 'X2'가 컬럼 이름으로 될 것입니다. 그리고 그 키를 기준으로 파일을 저장하게 됩니다. 이 자료를 저장해 봅시다.

import csv

with open("data_out.csv", "w", newline="") as f:
    fieldnames = ['ID', 'X1', 'X2']
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    for item in data:
        writer.writerow(item)

여기서 주의할 코드를 살펴보겠습니다. 첫 번째로 컬럼 이름을 저장하는 부분입니다.

writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()

이 부분에서 fieldnames = ['ID', 'X1', 'X2']을 컬럼 이름으로 만듭니다. 이를 토대로 data 리스트를 한 개씩 읽어서 적절하게 저장하게 됩니다. 자료를 저장하는 코드는 다음 코드 입니다.

    for item in data:
        writer.writerow(item)

이 코드가 data 리스트를 한 개씩 읽어서 컬럼 이름에 맞게 한 줄씩 저장하게 됩니다. 실행 결과는 다음과 같습니다.

>>> with open("data_out.csv", "w", newline="") as f:
...     fieldnames = ['ID', 'X1', 'X2']
...     writer = csv.DictWriter(f, fieldnames=fieldnames)
...     writer.writeheader()
...     for item in data:
...         writer.writerow(item)
... 
10
10
10
10
10
10

이렇게 만들어어진 data_out.csv 파일을 확인해 보면, 다음과 같이 저장된 것을 확인할 수 있습니다. 컬럼 이름도 적절하게 들어있습니다.

ID,X1,X2
A1,1,3.0
A2,2,4.5
A3,3,3.2
A4,4,4.0
A5,5,3.5