Handling CSV data with python

jm_yoon·2020년 12월 30일
1

csv란?

CSV(Comma Seperated Value) 데이터는 쉼표를 기준으로 항목을 구분하여 저장하는 데이터이다. 콤마로 규칙적으로 구분되어 있기 때문에 엑셀과 같은 프로그램으로도 읽을 수 있고, 또 생성할 수도 있다. 주로 테이블 형태로 구성된 자료텍스트 자료를 저장할 때 사용한다.

데이터의 크기가 작고, 많은 애플리케이션에서 활용할 수 있는 범용 형식이기 때문에 자료를 주고 받아야 하는 다양한 상황에서 CSV형식을 사용한다. 같은 데이터를 저장한다고 했을 때, JSON 데이터에 비하여 절반 이하의 용량으로 저장할 수 있는 장점이 있다.

쉼표를 대신하여 다른 문자 ($, %, etc.)를 이용하여 구분하도록 지정할 수도 있다.
예를 들어 데이터 자체에 쉼표가 포함되어 있을 경우 다른 기호로 대체하여 사용할 수 있다.

CSV 파일의 한 줄 한 줄이 행(row) 한 개가 되고, 열(column) 사이에는 쉼표를 넣어 구분한다. 한 열을 필드(field)라고 부르기도 함.

csv 예시

menu,category,product
음료,콜드 브루 커피,나이트로 바닐라 크림
음료,콜드 브루 커피,제주 비자림 콜드
음료,콜드 브루 커피,코코넛 화이트 콜드 브루
음료,콜드 브루 커피,나이트로 쇼콜라 클라우드
음료,콜드 브루 커피,콜드 브루 몰트
음료,브루드 커피,아이스 커피
음료,브루드 커피,오늘의 커피
음료,에스프레소,에스프레소 콘 파나
음료,에스프레소,에스프레소 마키아또
음료,에스프레소,카페 아메리카노
음료,프라푸치노,더블 에스프레소 칩 프라푸치노
음료,프라푸치노,블랙 와플칩 크림 프라푸치노
음료,프라푸치노,피스타치오 크림 프라푸치노 

header를 포함하여 총 14줄의 데이터이고, menu, category, product 3개 필드가 있다.

중복된 값 한번만 나열하기

menu,category,product
음료,콜드 브루 커피,나이트로 바닐라 크림
,,제주 비자림 콜드
,,코코넛 화이트 콜드 브루
,,나이트로 쇼콜라 클라우드
,,콜드 브루 몰트
,브루드 커피,아이스 커피
,,오늘의 커피
,에스프레소,에스프레소 콘 파나
,,에스프레소 마키아또
,,카페 아메리카노
,프라푸치노,더블 에스프레소 칩 프라푸치노
,,블랙 와플칩 크림 프라푸치노
,,피스타치오 크림 프라푸치노

위에서 음료 라는 메뉴 이름과 콜드 브루 커피, 브루드 커피, 에스프레소, 프라푸치노 를 여러번 사용하지 않고 바로 위의 예시처럼 값을 비워두고 콤마(,)만 입력하여 중복되는 값을 한번만 입력 할 수 있다.

csv파일은 어떻게 만드는가?

크롤링 하여 csv파일에 저장 하거나 확장자를 .csv로 저장한 빈파일에서 직접 만드는 방법이 있다.

파이썬으로 csv파일 읽고 MySQL데이터베이스에 입력하기

파이썬에는 CSV 파일을 다루기 위한 모듈인 csv.reader( ) 와 csv.DictRedader( )가 있다.

Django project의 각각의 table과 csv파일을 매칭시켜 데이터베이스에 입력하기 위해서는 Django project안 manage.py가 위치한 디렉토리에 db_uploader.py를 생성한다.

# 필요한 모듈 연결하기 
import os
import django
import csv
import sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "westarbucks.settings")
django.setup()
# db_uploader.py는 장고 밖에서 생성한 파일이므로 django project와 연결 시키겠다는?의미임
# .settings앞에는 연결시킬 장고프로젝트 이름을 쓰면된다.

from products.models import Menu, Category, Drink, Image
# 장고프로젝트앱의 model을 불러온다.

CSV_PATH_PRODUCTS = './drinks.csv'
#csv파일의 경로를 써준다. 될수있으면 이 파일과 같은 위치가 좋다.(상위폴더까지는 ok)

with open(CSV_PATH_PRODUCTS) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None) #첫줄(헤더)은 출력이 안되도록 해주기
    for row in data_reader:
        if row[0]: #0번째 인덱스가 존재하면 출력하라(빈칸없이출력)

파이썬에서 with open (file_name) as (file_name): 구문을 이용하면 외부 파일을 연 상태로 작업한다. csv.reader 메소드를 이용하면 파일 내부의 모든 행을 rows이라는 변수에 담을 수 있다.
모든 행을 한 줄 한 줄 읽으면서 작업을 수행하기 위해서 for 문을 활용한다.

create하기 전에 먼저 저장할 데이터를 print해보면서 알맞은 형태로 가져오는 지 확인 후 create해줄것!

전체적인 flow

장고프로젝트 models.py보고 생성할 테이블 확인
➡️➡️➡️ db_uploader.py 작성, 가져올 데이터 print문 작성후 저장
➡️➡️➡️ manage.py가 있는 곳에서 python db_uploader.py입력하여 가져올 데이터인지 확인
➡️➡️➡️ 가져올 데이터가 맞다면 db_uploader.py에서 create 해주기
📍ex)📍Menu.objects.create(name=menu_name)ForeignKey키가 필요할 경우,menu_id = Menu.objects.get(name = menu_name).idget메소드를 이용해 가져온 후 생성하기Category.objects.create(name = category_name, menu_id = menu_id)
➡️➡️➡️ python manage.py shell입력하여 데이터 잘 저장됐는지 확인하기
➡️➡️➡️ 다른 터미널창에서 mysql연결하여 데이터테이블 잘 저장됐는지 확인하기

profile
Hello!

0개의 댓글