BackEnd King KY

TIL30 - CSV파일 만들기(Using Python) 본문

Python

TIL30 - CSV파일 만들기(Using Python)

Django King, Lee 2022. 7. 10. 16:07
728x90


CSV

Celery에 이어서 추가 내용인데, 수집한 데이터를 CSV 파일로 만든 뒤 S3에 저장하고 있습니다.

그 다음 데이터베이스에 저장하는 과정을 통해 앱 이용자들에게 정보를 제공합니다.

나이스 오픈 API에서 경기도 내에 있는 외국어 고등학교에 존재하는 학과 리스트들을 csv 파일로 만드는 과정에 대해 포스팅 해보겠습니다.


사전 준비

우선, csv파일을 생각해보면 가장 첫 줄에는 컬럼명이 들어가 있습니다.

그러면, 그 컬럼들에 대한 정의가 필요합니다.

오픈API 홈페이지에 가면 출력 컬럼들이 나오게 됩니다.

image

이 해당 컬럼을 우선 정의해줍니다.

MAJOR_INFO = {
"ATPT_OFCDC_SC_CODE" : "시도교육청코드",
"ATPT_OFCDC_SC_NM" : "시도교육청명",
"SD_SCHUL_CODE" : "표준학교코드",
"SCHUL_NM" : "학교명",
"DGHT_CRSE_SC_NM" : "주야과정명",
"ORD_SC_NM" : "계열명",
"DDDEP_NM" : "학과명",
"LOAD_DTM" : "수정일"
}

그 다음, 한 줄 한 줄 읽을때마다 하나의 파일로 만들어서 저장해야 합니다.

그 때 사용하는 것이 io.StringIO() 입니다.

점프투파이썬에서 StringIO에 대한 설명이 있는데, 문자열을 파일객체처럼 다룰 수 있게 해주는 클래스라고 합니다.

image

예를 들어 StringIO("hihi") 라고 저장하면, "hihi"라는 문자열이 담긴 파일 객체로 사용하겠다는 의미로 해석할 수 있습니다.


이렇게 파일을 지정했으면, 이 파일에 한 줄 한 줄 어떤 것에 대한 값인지 읽을 수 있도록 해야 합니다.

그 때 사용하는 것이 DictWriter라는 메소드입니다.

python csv 공식문서에 나와 있는데, 파일을 지정하고 해당 파일에서 읽어올 필드명을 설정하면 그에 맞는 값을 읽을 수 있습니다.


마지막으로 데이터도 준비가 되었고, 어떻게 값들을 읽을 지 알았으면 그 값을 저장하는 방법에 대해 알아야 합니다.

그 때 사용하는 것이 writerow입니다.

writerowwriterows 두 개가 있는데, 전자는 한 줄씩 입력할 때 사용하고 후자는 여러 줄을 한 번에 입력할 때 사용합니다.

자세한 예시는 여기에서 확인할 수 있는데, 저는 두 개 다 사용해보겠습니다.


writerow

위에서 설명한대로 코드를 작성해보겠습니다.

저는 나이스 오픈 API에서 불러온 정보를 responses로 저장했습니다.

responses는 리스트 안에 딕셔너리 형태로 데이터들이 저장되어 있습니다.

image
import io
import csv

csv_writerow = io.StringIO()

writer = csv.DictWriter(csv_writerow, fieldnames=MAJOR_INFO.keys())

for response in responses:
  if "외국어" in response["SCHUL_NM"]:
    writer.writerow(response)

이렇게 했을 떄 csv_writerow에 저장된 값을 확인하기 위해 getvalue()라는 메소드를 사용합니다.

image

이렇게 되면 csv파일이 만들어지게 되는 것이고 이후 저장은 본인이 원하는 디렉토리를 설정하면 됩니다.


writerows

import io
import csv

csv_writerows = io.StringIO()

writer = csv.DictWriter(csv_writerows, fieldnames=MAJOR_INFO.keys())

csv_list = list()

for response in responses:
  if "외국어" in response["SCHUL_NM"]:
    csv_list.append(response)

writer.writerows(csv_list)

csv_writerows.getvalue()

이렇게 했을 때 csv_writerows를 확인해보면 이렇게 값이 저장된 걸 확인할 수 있습니다.

image

Outro

이렇게해서 csv파일 만드는 법을 알아봤습니다.

처음에는 익숙치 않은데, 역시 반복으로 하다보면 충분히 적응되네요.