파이썬 장고 csv 파일 읽기와 데이터베이스(DB, sqlite3)에 저장하기

data-full-width-responsive="true">

난 초보중에 초보다.

이걸 성공시키기 위해 며칠동안을 헤매고 헤맸다.

그래도 성공해서 너무 기쁘다.

참고로 아래 내용을 실행하려면 장고에서는 views.py에 코딩을 해주고 런서버를 해주면 된다.

그런데 이렇게하면 서버가 실행될때마다 db에 저장을 하게 되니, 뷰에서 함수로 정의해주고, 적당한 url을 하나 설정해서 브라우저에서 그 url을 직접 치고 들어가면 그때만 이 코드가 작동하도록 할 수 있다.

마치 127.0.0.1:8000/admin 을 치고 들어가면 관리자 페이지가 나오는 것과 같은 원리다.

어떤 내용인가 설명하자면 csv 파일을 읽고 그 내용(회사명, 종목코드, 상장일)을 장고(django)의 기본 데이터베이스(DB)인 sqlite3(에스큐엘라이트)에 저장한 것이다.

난 장고를 사용하기 때문에 아래와 같이 import를 하고 어쩌고 했지만 장고가 아니라면 더 쉽게 할 수 있을 것이다.

아니다. 파이선(python) django를 이용하지 않는다면 sql 쿼리문을 작성해야하니까 모르면 더 어려울수도 있을 것 같다.

초보자를 위해 간단히 아래코드를 설명하면 with open으로 csv 파일읽기를 했다.

그리고 읽은 내용을 판다스(pandas) 데이터프레임으로 바꾸고 그걸 변수 s에 담았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import csv
 import pandas as pd
from ssapp.models import Stock
with open(‘d:/djangoprojects/파일경로와 csv파일이름.csv’,‘r’) as f:
    dr = csv.DictReader(f)
    s = pd.DataFrame(dr)
ss = []
for i in range(len(s)):
    st = (s[‘회사명’][i], s[‘종목코드’][i], s[‘상장일’][i])
    ss.append(st)
for i in range(len(s)):
    Stock.objects.create(name=ss[i][0], code=ss[i][1], ipo_date=ss[i][2])
cs

s는 데이터프레임이라서 s[0]의 값은 첫번째 회사와 그에 대한 코드, 상장일이 된다.

같은 방식으로 s[1]의 값은 두번째 회사와 그에 대한 내용들이 담겨있다.

data-full-width-responsive="true">

ss라는 빈 리스트 공간을 만들었다. 여기에 모든 회사의 정보를 리스트의 형태로 담는다.

마지막 for문은 데이터베이스에 데이터를 저장하는 것이다.

Stock는 장고에서 models.py에 등록해둔 클래스이다.

그 클래스에는 name, code, ipo_date의 값들이 들어가도록 했다.

아래에 있는 것이 models.py의 내용이다.

 

from django.db import models

class Stock(models.Model):
    name = models.CharField(max_length=20)
    code = models.CharField(max_length=9)
    ipo_date = models.DateField(null=True)
    def __str__(self):
        return self.name

 

클래스.objects.create() 메서드를 사용하면 db에 저장이 된다.

저장되는 형태는 name, code, ipo_date로 models에서 만든 형태로 알맞는 값을 넣는다.

db에 저장하는 글이 없어서 한참을 헤맸는데 초보들에게 도움이 되는 글이었으면 좋겠다.

data-full-width-responsive="true">

You may also like...

2 Responses

  1. Jane 댓글:

    안녕하세요:) csv 파일 sqlite db로 넣는 법 구글링하다가 우연히 발견하고 도움받고 갑니다! 혹시 제 코드 깃허브에 올려도 될까요? 이 웹사이트에서 도움 받았다고 명시도 하겠습니다! 감사합니다~

댓글 남기기

이메일은 공개되지 않습니다.