ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL. 53 CSV 파일 데이터로 집어넣기 (Django, MySQL)
    TIL/Python 2020. 12. 1. 17:52
    728x90

    CSV 파일이란

    CSV(Comma Seperated Value) 데이터는 쉼표를 기준으로 항목을 구분하여 저장하는 데이터를 말하며

    콤마로 규칙적으로 구분되어 있기 때문에 엑셀과 같은 프로그램으로도 읽을 수 있고, 또 생성할 수도 있다.

    주로 테이블 형태로 구성된 자료나 텍스트 자료를 저장할 때 사용한다.

     

    Python은 어떻게 CSV파일을 읽을 수 있을까

    대부분의 프로그래밍 언어가 텍스트 파일을 읽을 수 있다.

    특히 파이썬에는 CSV 파일을 다루기 위한 모듈이 있으며

    그 중 csv.reader( ) 또는 csv.DictRedader( )라는 메소드를 이용하면 매우 쉽게 .csv 파일을 다룰 수 있다.

     

    예제

    import csv #csv파일을 다루기 위한 라이브러리를 import 합니다.
    
    with open('wecode.csv') as csv_file:
        rows = csv.reader(csv_file, delimiter = ',')
    		for row in rows:
    				print(row)

    파이썬에서 with open (file_name) as (file_name): 구문을 이용하면 외부 파일을 연 상태로 작업할 수 있게 만든다

    csv.reader 메소드를 이용하면 파일 내부의 모든 행을 rows이라는 변수에 담을 수 있으며 

    모든 행을 한 줄 한 줄 읽으면서 실제로 어떤 값이 읽어지는지 확인하여 구성한 models.py를 바탕으로

    적절한 값을 넣고 적절한 CRUD 작업을 수행하기 위해서 for 문, if 문등 다양하게 활용 할 수 있다.

     

    아래의 products.csv 파일을 이용해 데이터 집어 넣기

    # products.csv text파일
    menu,category,product
    음료,콜드 브루 커피,나이트로 바닐라 크림
    ,,제주 비자림 콜드
    ,,코코넛 화이트 콜드 브루
    ,,나이트로 쇼콜라 클라우드
    ,,콜드 브루 몰트
    ,브루드 커피,아이스 커피
    ,,오늘의 커피
    ,에스프레소,에스프레소 콘 파나
    ,,에스프레소 마키아또
    ,,카페 아메리카노
    ,프라푸치노,더블 에스프레소 칩 프라푸치노
    ,,블랙 와플칩 크림 프라푸치노
    ,,피스타치오 크림 프라푸치노
    ,블렌디드,피치 & 레몬 블렌디드
    ,,망고 패션 후르츠 블렌디드
    ,,딸기 요거트 블렌디드
    ,블렌디드,망고 바나나 블렌디드
    ,,익스트림 티 블렌디드
    ,스타벅스 피지오,매직 팝 스플래쉬 피지오
    ,,블랙 티 레모네이드 피지오
    ,,쿨 라임 피지오
    ,,패션 탱고 티 레모네이드 피지오
    ,,핑크 자몽 피지오
    ,티(티바나),피치 젤리 핫 티
    ,,피치 젤리 아이스 티
    ,기타 제조 음료,시그니처 핫 초콜릿
    ,,아이스 시그니처 초콜릿
    ,,플러피 판다 핫 초콜릿
    푸드,베이커리,녹차 머핀
    ,,다크 초콜릿 칩 머핀
    ,,상큼한 블루베리 머핀
    ,케이크,서머 베리 요거트 케이크
    ,,7 레이어 가나슈 케이크
    ,,레드벨벳 크림치즈 케이크
    ,,마스카포네 티라미수 케이크
    ,샌드위치 & 샐러드,베이컨 포테이토 롤
    ,,스크램블 에그 롤
    ,,애플 까망베르 샌드위치
    ,,트리플 머쉬룸 치즈 샌드위치
    ,따뜻한 푸드,트러플 머쉬룸 수프
    ,,현미 크림 수프
    ,과일 & 요거트,사과 가득 핸디 젤리
    ,,제주 자연 청 세트
    ,,하루 한 컵 RED
    ,스낵 & 미니 디저트,로고 코인 다크 초콜릿 (골드)
    ,,로스티드 아모든 앤 초콜릿
    ,아이스크림,유기농 바닐라 아이스크림
    ,,유기농 초콜릿 아이스크림
    상품,머그,
    ,글라스,
    ,플라스틱 텀블러,
    ,스테인리스 텀블러,

     

     

     

     

     


    핵심 내용만을 간략히 포스팅

    1. models.py 생성


    2. 모델 활성화

    makemigrtions로 모델 활성화

    migrate로 MySQL에 데이터베이스 생성


    3. manage.py 위치에 csv 파일을 불러와서 데이터베이스에 입력을 해줄 .py 파일을 하나 생성해준다.

    (db_uploader.py 생성해줌)

    # manage.py 경로에 db_uploader.py
    import os
    import django
    import csv
    import sys
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "westarbucks.settings")
    django.setup()
    
    from products.models import *  # django.setup() 이후에 임포트해야 오류가 나지 않음
    
    CSV_PATH_PRODUCTS='./products.csv'
    
    with open(CSV_PATH_PRODUCTS) as in_file:
            data_reader = csv.reader(in_file)
            next(data_reader, None) # 출력시 함께 출력되는 맨첫줄을 제외하고 출력하기 위함
            for row in data_reader:
                    print(row[0])

    4. Mene_CSV - Create

    하나하나 경우의 수를 모두 입력하여 어떤 상황에서 어떤 row 데이터를 얽어오는지 확인하며 작업하였다

    for 문으로 data_reader를 불러오면서 출력할 경우 (첫줄은 제외하고 출력됨)

    if row[0]: 이라는 조건으로 컬럼에서의 빈문자열이 아닐 경우에만 데이터를 읽어와 사용하도록 하자

    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]:
                    	menu_name_csv = row[0]
                        Menu_CSV.objects.create(menu_name = menu_name_csv)
                    	

     

    데이터를 한번 잘못넣어 데이터를 모두 삭제를 1번 진행하여 id 번호가 53부터 시작하게 되었다.


    5. Category_CSV - Create

    불어오는 row의 값 중 row[1]이 카테고리에 들어갈 내용이다.

    if row[1]: 이라는 조건으로 컬럼에서의 빈문자열이 아닐 경우에만 데이터를 읽어와 사용하도록 하자
    (CSV 파일에 빈문자열이 많기 때문이다)

    Menu_CSV의 FK를 읽고 이를 이용해 Category_

    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]:
                    	menu_name_csv = row[0]
                    if row[1]:
                    	category_name_csv = row[1]
                        menu = Menu_CSV.objects.get(menu_name=menu_name_csv)
                        Category_CSV.objects.create(menu_csv=menu, category_name=category_name_csv)
                    	

     

    음료 카테고리가 잘 매칭되는것을 볼 수 있다.


    6. Drink_CSV - Create

    불어오는 row의 값 중 row[2]이 음료에 들어갈 내용이다.

    row[2]값의 경우 빈문자열이 있는 항목은 없다 (음료의 이름이 없을 수 없다. 있으면 파일이 이상한거다)

    Category_CSV의 FK를 읽고 이를 이용해 Drink_CSV에 값넣기

    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]:
                    	menu_name_csv = row[0]
                    if row[1]:
                    	category_name_csv = row[1]
                    drink_name_scv = row[2]
                    category_pk = Category_CSV.objects.get(category_name=category_name_csv)
                    Drink_CSV.objects.create(drink_name=drink_name_csv, category=category_pk)

    728x90
Designed by Tistory.