TIL 39 | Create Data with CSV

임종성·2021년 8월 7일
0

TIL

목록 보기
10/22
post-thumbnail

프로젝트를 진행하면서 Database를 생성하고 웹사이트의 각종 기능을 구현하다 보니 Modeling한 DB에 편하게 Data를 입력할 필요성을 느끼게 되었다. Python이 어떻게 외부 파일을 다루고, CSV 형태의 데이터를 어떻게 데이터베이스에 입력하는지 간단하게 알아보좌.

CSV Data

CSV(Comma Seperated Value) 데이터란 말 그대로 쉼표를 기준으로 항목을 구분하여 저장하는 데이터를 말한다. 주로 테이블 형태로 구성된 자료나 텍스트 자료를 저장할 때 사용한다. 데이터의 크기가 작고, 많은 애플리케이션에서 활용할 수 있는 범용 형식이기 때문에 자료를 주고 받아야 하는 다양한 상황에서 CSV형식을 사용한다.

Read CSV With Python

Python으로 CSV를 읽는 방법을 살펴보자. 먼저 아래와 같이 엑셀형태로 데이터를 저장하거나, 일반 텍스트파일에서 쉼표로 각 요소를 구분하여 .csv 확장자로 저장한다. 아래 파일은 category.csv 이다.


# db_uploader.py

import os
import django
import csv
import sys

# 외부 Python 파일의 내용이 Django에 적용될 수 있도록 설정을 바꿔준다.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "motemote.settings")
django.setup()

# Django Model을 불러온다.
from products.models import *

# CSV 파일 경로를 변수화하여 저장한다.
CSV_PATH_PRODUCTS = './category.csv'

# with open 이라는 파이썬 내장 모듈을 이용하여 외부 파일을 연 상태로 작업한다.
with open(CSV_PATH_PRODUCTS) as in_file:
    # csv.reader 메소드를 이용해 파일 내부의 모든 행을 list화 해준다.
    data_reader = csv.reader(in_file)
    # csv 파일의 첫번째 줄을 무시해준다.
    next(data_reader, None)
    for row in data_reader:
    	# row[0] = product_name
        if row[0]:
            product = Product.objects.create(name = row[0])
        # row[1] = category_name
        if row[1]: 
            Category.objects.create(name = row[1], product_id = product.id)

위와 같이 csv의 데이터를 나의 Database Table에 저장할 수 있다. 그 후에 작성한 db_uploader.py를 실행하여 Data를 생성한다.

python3 db_uploader.py

WeeteWeete Products Data

같은 방식으로 Color, Concept, Item, Image를 csv 파일로 작성한 후 db_uploader.py에서 Query Method를 이용해 Data를 생성해주었다.

  • concept.csv

  • item.csv

item.csv의 경우 category, concept, option 등 중복되는 id값은 공백으로 처리해도 되지만, 실제로 간단해보이는 이 작업들이 생각보다 오래 걸렸고, 시행착오가 많았기에 우선 확실하게 하기 위해 전부 채워넣었다. 이렇게 해도 Shell에서 직접 입력하는것보단 빠르니.. 조금씩 익숙해지면 ,,, 식으로 필요없는 데이터들은 지울 생각이다.


내 생각보다 CSV file을 활용하는 데 시간이 오래걸려버렸지만.. 앞으로 활용하기에 따라 Data 관리가 매우 수월해질 것 같다. 기능 구현이 제대로 작동하는지 알기 위해 억지로 데이터를 shell로 집어넣었었는데, 이제 그럴일 없이 csv를 이용해야겠다.

profile
어디를 가든 마음을 다해 가자

0개의 댓글