일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Prefetch_related
- Continuous Deployment
- apitestcase
- Coroutine
- F객체
- DRF
- Python
- nestedfunction
- 백준
- CD
- DjangoRestFramework
- racecondition
- 코루틴
- database
- django
- aggregate
- CI
- to_attr
- dry-yasg
- Git
- testcase
- EC2
- aws
- DjangoCache
- Transaction
- 도커
- Continuous Delivery
- docker
- QuerySet
- annotate
- Today
- Total
BackEnd King KY
TIL30 - CSV파일 만들기(Using Python) 본문
CSV
Celery에 이어서 추가 내용인데, 수집한 데이터를 CSV 파일로 만든 뒤 S3에 저장하고 있습니다.
그 다음 데이터베이스에 저장하는 과정을 통해 앱 이용자들에게 정보를 제공합니다.
나이스 오픈 API에서 경기도 내에 있는 외국어 고등학교에 존재하는 학과 리스트들을 csv 파일로 만드는 과정에 대해 포스팅 해보겠습니다.
사전 준비
우선, csv파일을 생각해보면 가장 첫 줄에는 컬럼명이 들어가 있습니다.
그러면, 그 컬럼들에 대한 정의가 필요합니다.
오픈API 홈페이지에 가면 출력 컬럼들이 나오게 됩니다.

이 해당 컬럼을 우선 정의해줍니다.
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
에 대한 설명이 있는데, 문자열을 파일객체처럼 다룰 수 있게 해주는 클래스라고 합니다.

예를 들어 StringIO("hihi") 라고 저장하면, "hihi"라는 문자열이 담긴 파일 객체로 사용하겠다는 의미로 해석할 수 있습니다.
이렇게 파일을 지정했으면, 이 파일에 한 줄 한 줄 어떤 것에 대한 값인지 읽을 수 있도록 해야 합니다.
그 때 사용하는 것이 DictWriter
라는 메소드입니다.
python csv 공식문서에 나와 있는데, 파일을 지정하고 해당 파일에서 읽어올 필드명을 설정하면 그에 맞는 값을 읽을 수 있습니다.
마지막으로 데이터도 준비가 되었고, 어떻게 값들을 읽을 지 알았으면 그 값을 저장하는 방법에 대해 알아야 합니다.
그 때 사용하는 것이 writerow
입니다.
writerow
와 writerows
두 개가 있는데, 전자는 한 줄씩 입력할 때 사용하고 후자는 여러 줄을 한 번에 입력할 때 사용합니다.
자세한 예시는 여기에서 확인할 수 있는데, 저는 두 개 다 사용해보겠습니다.
writerow
위에서 설명한대로 코드를 작성해보겠습니다.
저는 나이스 오픈 API에서 불러온 정보를 responses로 저장했습니다.
responses는 리스트 안에 딕셔너리 형태로 데이터들이 저장되어 있습니다.

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()
라는 메소드를 사용합니다.

이렇게 되면 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
를 확인해보면 이렇게 값이 저장된 걸 확인할 수 있습니다.

Outro
이렇게해서 csv파일 만드는 법을 알아봤습니다.
처음에는 익숙치 않은데, 역시 반복으로 하다보면 충분히 적응되네요.
'Python' 카테고리의 다른 글
TIL35 - 코루틴 사용하기(2/6) : 코루틴바깥으로 값 전달하기 (0) | 2022.10.09 |
---|---|
TIL35 - 코루틴 사용하기(1/6) : 코루틴에 값 보내기 (0) | 2022.10.09 |
TIL29 - Celery - Distributed Task Queue (0) | 2022.07.09 |
TIL23 - heapq (0) | 2022.04.07 |
TIL7 - Nested Function & decorator (0) | 2022.02.20 |