2020년 5월 26일 화요일

12. 파이썬 데이터베이스 연동 ( 테이블 수정, 삭제 )

학습목표 : 테이블 수정 삭제


  • UPDATE
  • DELETE
  • DB 사용 권장 이유

C - CREATE(생성) / R - RETRIEVE(조회) / U - UPDATE(수정) / D - DELETE (삭제)

SQLite를 활용하기 위한 설정 코드는 다음과 같이 작성한다.
import sqlite3

# DB 생성(파일)
conn = sqlite3.connect("D:/##Python_Basic/resource/database.db")

# Cursor 생성
c = conn.cursor()

데이터 수정 01
c.execute("UPDATE users SET username =? WHERE id =?", ('niceman'2))
conn.commit()
🔻반드시 DB browser에 변경된 데이터값을 연동하기 위해서는 commit()을 선언해 줘야한다.

데이터 수정 02 ( Dictionary 활용법 )
c.execute("UPDATE users SET username = :name WHERE id = :id", {'name':'goodman''id':'5'})
# conn.commit() # 반드시 프로그램에 수정사항을 연동하기 위해서는 commit을 선언해야한다

데이터 수정 03 ( %s 활용법 )
c.execute("UPDATE users SET username = '%s' WHERE id ='%s'" %('badboy',3))
conn.commit() # 반드시 프로그램에 수정사항을 연동하기 위해서는 commit을 선언해야한다

SQLite에 입력된 데이터를 보기 위한 코드는 다음과 같이 작성한다.
# 중간 데이터 확인 01
for user in c.execute("SELECT * FROM users"):
    print(user)

데이터 삭제 01 ( 기본 )
# Row DELETE 01
c.execute("DELETE FROM users WHERE id =?", (2,))

데이터 삭제 02 ( Dictionary 활용 )
c.execute("DELETE FROM users WHERE id=:id", {'id':5})

데이터 삭제 03 ( %s 활용 )
c.execute("DELETE FROM users WHERE id = '%s'" %4)

전체 데이터 삭제와 삭제된 행수를 알려주는 코드 작성법은 다음과 같다.
# 테이블 전체 데이터 삭제
print("users db deleted : ", conn.execute("DELETE FROM users").rowcount, ' rows'

🔻여기까지 코드를 실행했다면 테이블에 있는 데이터는 전부 삭제되어 데이터를 입력하는 단계에서부터 다시 시작해야 데이터를 활용한 코드들을 실행할 수 있다.

이번 포스트의 코드들은 [ with ]문을 활용하여 작성되어 있지 않았기 때문에 반드시 [ close ] 문을 작성해서 연결을 끊어줘야한다.
# 접속 해제
conn.close()









12. 파이썬 데이터베이스 연동

학습 목표 : 다양한 데이터 조회

  • SQLite 기본 사용법
  • Selete
  • Where
  • Tuple, Dictionary Mapping
SQLite의 데이터베이스를 활용하기 위해 기본적으로 작성하는 코드는 다음과 같다.
import sqlite3

# DB파일 조회(없으면 새로 생성)
conn = sqlite3.connect("D:/##Python_Basic/resource/database.db"# 본인 DB 경로

# 커서 바인딩
c = conn.cursor()

# 데이터 조회(전체)
c.execute("SELECT * FROM users")

데이터를 파이썬에서 불러올 때 커서의 위치에 따라 불러오는 데이터가 달라진다.(커서의 위치 중요 )
# 커서 위치가 변경
# 1개 로우 선택
print("One -> \n", c.fetchone())

#지정 로우 선택
print("Three -> \n", c.fetchmany(size=3))

# 전체 로우 선택
print("All -> \n", c.fetchall())

순회해서 데이터를 읽어오는 방식 01 ( For문 활용 )
rows = c.fetchall()
for row in rows:
    print("retriview1 >", row)

순회해서 데이터를 읽어오는 방식 02 ( For문 활용 ) - 더 많이 활용된다
for row in c.fetchall():
    print("retriview2 >", row)

순회해서 데이터를 읽어오는 방식 03 ( For문 활용 )
# 순회3
for row in c.execute("SELECT * FROM users ORDER BY id desc"):
    print("retriview3 >", row)

🔻 커서의 위치로 인해 두 코드를 연속해서 작성해도 두번 실행되지 않는다.

WHERE문을 활용하여 데이터 값 읽어오기 ( 3번 데이터 값은 하나이기 때문에 fetchall 문을 실행해도 이전에 불러왔기 때문에 빈 값으로 불러와 진다. )
param1 = (3, )
c.execute("SELECT * FROM users WHERE id = ?", param1)
print('param1', c.fetchone())
print("param1", c.fetchall())

%s를 활용하여 WHERE문을 작성하는 방법은 다음과 같다.
param2 = 4
c.execute("SELECT * FROM users WHERE id='%s'" % param2) # %s - 문자열 / %f - float / %d 정수형
print("param2", c.fetchone())
print("param2", c.fetchall()) # 데이터 없음

Dictionary를 활용하여 WHERE문을 작성하는 방법은 다음과 같다.
c.execute("SELECT * FROM users WHERE id=:Id", {"Id":5})
print("param3", c.fetchone())
print("param3", c.fetchall())

IN함수(합집합)을 활용하여 WHERE문을 작성하는 방법은 다음과 같다.
param4 = (35)
c.execute("SELECT * FROM users WHERE id IN(?,?)", param4)
print("param4", c.fetchall())

In함수를 활용하여 WHERE문을 작성하는 방법 2는 다음과 같다.( %d 활용 )
c.execute("SELECT * FROM users WHERE id IN('%d','%d')" %(3,4))
print("param5", c.fetchall())

OR문과 Dictionary를 활용하여 WHERE문을 작성하는 방법은 다음과 같다.
c.execute("SELECT * FROM users WHERE id=:id1 OR id=:id2", {"id1":2"id2":5})
print('param6', c.fetchall())

Dump문을 작성하여 Backup 데이터를 생성하는 코드는 다음과 같이 작성한다.
with conn:
    with open('D:/##Python_Basic/resource/dump.sql','w'as f:
        for line in conn.iterdump():
            f.write('%s\n' % line)
        print('Dump Print Complete')

 # with문을 활용했기 때문에 f.close()와 conn.close() 함수가 출력되었다.

2020년 5월 20일 수요일

12. 파이썬 데이터베이스 연동

학습목표 : 데이터베이스 및 테이블 생성


  • SQLite 기본 사용법
  • 테이블 생성
  • 데이터 삽입
  • 기본 SQL 사용 예제

sqlite 불러오기와 본인의 버전 확인 방법은 다음과 같다.


import sqlite3

# sqlite3
print("sqlite3.version : ", sqlite3.version)
print("sqlite3.sqlite_version : ", sqlite3.sqlite_version)

파이썬을 통해 현재시간을 가져오는 코드는 다음과 같이 작성한다.
import sqlite3
import datetime

# 삽입 날짜 생성
now = datetime.datetime.now()
print("now : ", now)

nowDatetime = now.strftime("%Y-%m-%d %H:%M:%S")
print("nowDatetime : ", nowDatetime)

데이터베이스를 생성하기 위해서는 다음과 같이 코드를 작성한다. 그러나 자동으로 연동되기 위해서는 추가적으로 [ isolation_level=None ]을 기입한다.
# DB 생성 & Auto Commit (Rollback)
conn = sqlite3.connect("D:/##Python_Basic/resource/database.db"isolation_level=None)

다음으로 데이터를 작성하기 위해서 커서를 불러온다. 불러오는 코드는 다음과 같이 작성한다.
c = conn.cursor()
print("Cusor Type : "type(c))

테이블에 들어가는 데이터 타입은 다음과 같다.
  • text ( 문자열을 표현한다. )
  • NUMERIC( 소수점까지 표현한다. )
  • INTEGER ( 정수를 표현한다. )
  • REAL ( 소수점까지 표현한다. )
  • BLOB
테이블 생성시 코드는 다음과 같이 작성을 한다. ( [ | ] 역슬레시는 코드작성이 길어졌을 경우 아래열까지 코드가 이어서 쓸 수 있도록 해준다.
c.execute("CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, username text,\
     email text, phone text, website text, regdate text)")



🔻테이블 생성시 코드에 오타가 났을 경우 다음과 같은 순서로 오류가 나타나지 않도록 수정한다.

  • 1. 데이터베이스 자료를 닫는다.

  • 2. 파이썬에서 db파일을 삭제한다.

  • 3. 파이썬에서 코드를 재 실행한다.
  • 4. 데이터베이스를 다시 불러온다.

테이블에 데이터를 삽입은 다음과 같이 코드를 작성한다.
# 데이터 삽입
c.execute("INSERT INTO user VALUES(1, 'Koo', 'Koo@naver.com', '010-0000-0000',\
    'Koo.com, ?')", (nowDatetime, ))

🔻 [ ? ] 로 마지막 코드를 작성한 이유는 모든 코드들이 다 문자열로 이루어져있다. 그러나 현재시간의 경우에는 숫자로 구성되어 있으며 클래스의 값을 불러오는 것이기 때문에 다음과 같이 작성을 한다.

🔻 위에서 선언한 [ PREMIRE KEY를 선언함으로 중복을 허용하지 않기 때문에 이전에 선언한 데이터 값은 주석처리를 해줘야한다.
# c.execute("INSERT INTO users VALUES(1, 'Koo', 'Koo@naver.com', '010-0000-0000',\
    # 'Koo.com', ?)", (nowDatetime, ))


데이터 삽입 코드는 다음과 같은 방식으로도 작성한다. (튜플 형식)
c.execute("INSERT INTO users(id, username, email, phone, website, regdate) \
    VALUES (?,?,?,?,?,?)",\
    (2'Park''Park@daum.net''010-1111-1111''park.com', nowDatetime))

한번에 다양한 데이터를 입력할 경우에는 [ excutemany ] 코드로 작성하며 그 코드작성법은 다음과 같다.
userList = (
    (3'Lee''Lee@naver.com''010-2222-2222''Lee.com', nowDatetime),
    (4'Cho''Cho@naver.com''010-3333-3333''Cho.com', nowDatetime),
    (5'Yoo''Yoo@daum.net''010-4444-4444''Yoo.com', nowDatetime)
)

c.executemany("INSERT INTO users(id, username, email, phone, website, regdate) \
    VALUES (?,?,?,?,?,?)", userList)

테이블에 작성되어 있는 데이터 전체 삭제는 다음과 같이 코드를 작성한다.
# 테이블 데이터 삭제
conn.execute("DELETE FROM users")

삭제된 데이터의 갯수를 확인하는 코드는 다음과 같이 작성한다.
print("users db deleted : ", conn.execute("DELETE FROM users").rowcount)

db 프로그램과 연동하기 위해서는 다음과 같은 코드를 작성하며 코드를 작성한 위치에 따라 데이터 연동의 유무가 결정된다.
conn.commit()

db 프로그램과 연동을 취소하기 위해서는 다음과 같은 코드를 작성한다.
conn.rollback()

반드시 db 프로그램과 연동이 됬다면 [ close ] 코드를 통해 닫아줘야한다.
conn.close()


2020년 5월 17일 일요일

11. 파이썬 외부 파일 처리

학습목표


  • CSV 읽기, 쓰기
  • XSL, XLSX 읽기
  • 패키지 설치

csv 파일을 읽어올때 사용되는 가장 기본이 되는 코드이다.
import csv

with open("./resource/sample1.csv"'r'as f:
    reader = csv.reader(f)

    print(reader)

reader의 형식을 보기 위한 코드는 다음과 같이 작성을 한다. ( 형식확인을 위한 절차 )
    print(type(reader))
    print(dir(reader))

csv 파일에 있는 내용을 불러오기 위한 코드는 다음과 같이 작성한다.
    for c in reader:
        print(c)

해더(파란색) 스킵을 위한 코드는 다음과 같이 작성되며 작성된 횟수만큼 결과값의 맨위에서부터 생략이 된다.
    next(reader)
  • 결과 값 :
['번호', '이름', '가입일시', '나이']
['1', '김정수', '2017-01-19 11:30:00', '25']
['2', '박민구', '2017-02-07 10:22:00', '35']
['3', '정순미', '2017-01-22 09:10:00', '33']
['4', '김정현', '2017-02-22 14:09:00', '45']
['5', '홍미진', '2017-04-01 18:00:00', '17']
['6', '김순철', '2017-05-14 22:33:07', '22']
['7', '이동철', '2017-03-01 23:44:45', '27']
['8', '박지숙', '2017-01-11 06:04:18', '30']
['9', '김은미', '2017-02-08 07:44:33', '51']
['10', '장혁철', '2017-12-01 13:01:11', '16']

[ delimiter ] 코드를 활용하여 구분되는 부분을 지정할 수 있다.
with open("./resource/sample2.csv"'r'as f:
    reader = csv.reader(f, delimiter = '|')

    print(reader)
    print(type(reader))
    print(dir(reader))
    print()

    for c in reader:
        print(c)

CSV 파일을 딕셔너리로 정리하기 위한 코드는 다음과 같이 작성한다.
print("P. 03")
with open('./resource/sample1.csv','r'as f:
    reader = csv.DictReader(f)

    for c in reader:
        print(c)

딕셔너리에서 Key와 Values로 나눠서 표현하고자하면 다음과 같이 코드를 작성한다.
with open('./resource/sample1.csv','r'as f:
    reader = csv.DictReader(f)

    for c in reader:
        for k, v in c.items():
            print(k,v)
        print("-------------------------")

  • 결과 값 :
번호 9
이름 김은미
가입일시 2017-02-08 07:44:33
나이 51
-------------------------
번호 10
이름 장혁철
가입일시 2017-12-01 13:01:11
나이 16
-------------------------

csv 파일을을 생성하기 위해서는 리스트를 작성하고 다음과 같이 코드를 작성한다. 그러나 하나의 리스트는 [ 한 줄 ]로 들어간다.
w = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]

with open('./resource/sample3.csv''w'as f:
    wt = csv.writer(f)

    for v in w:
        wt.writerow(v)

이를 보완하기 위해서 [ newline ]을 활용하여 줄 바꿈처리를 어떻게 할지를 지정한다.
w = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]

with open('./resource/sample3.csv''w'newline=''as f:
    wt = csv.writer(f)

    for v in w:
        wt.writerow(v)

[ For ] 문을 활용하지 않고 csv 파일을 생성할시 다음과 같이 코드를 작성한다.
with open('./resource/sample4.csv','w',newline=''as f:
    wt = csv.writer(f)
    wt.writerows(w)

하나하나 검수를 할 시에는 [ writerow ]로 코드를 작성하며 그렇지 않고 검수가 끝난 데이터의 경우(모든 데이터를 넣을 시)의 경우에는 [ writerows ]로 코드를 작성한다.

# XSL, XLSX
# openpyx1,  xlsxwriter, xlrd, xlwt, xlutils
# pandas를 주로 사용 (openpyxl, xlrd)
# pip install xlrd
# pip install openpyxl
# pip install pandas

엑셀 ( sheetname=시트명 or 숫자 / header=숫자 / skiprow=숫자(넘어간다) )
import pandas as pd

xlsx = pd.read_excel('./resource/sample.xlsx')

head 명령어는 위에서 부터 5개의 데이터를 불러온다.
print(xlsx.head())
tail 명령어는 밑에서부터 5개의 데이터를 불러온다.
print(xlsx.tail())
shape 명령어는 엑셀데이터의 행과 열의 개수를 파악해준다.
print(xlsx.shape)

CSV 또는 EXCEL 파일로 생성 방법 (기초)
xlsx.to_excel('./resource/result.xlsx'index=False)
xlsx.to_csv("./resource/reslut.scv"index=False)

10. Python Basic - 파이썬 에러 및 예외

학습 목표

파이썬 예외 종류
문법적 에러 발생 실습
런타임 에러 발생 실습
Try - except - else - finally

문법적으로 에러가 없지만, 실행(런타임) 프로세스에서 발생하는 예외 처리 중요
linter : 코드스타일, 문법 체크를 해주는 기능

- 1번째 에러 - Syntax Error = 잘못된 문법
- 2번째 에러 - Name Error = 참조 변수가 없을 경우
- 3번째 에러 - ZeroDivisionError = 0 나누기 에러(언어 공통으로 나타난다)
- 4번째 에러 - Index Error = 인덱스 범위가 오버된 경우에 나타난다
- 5번째 에러 - Key Error = (딕셔너리에서 자주 발생하는 에러) 없는 키값을 불러올때 나오는 에러

그래서 5번째 에러를 사전에 방지하기 위해서 Get 메소드를 활용한다.

- 6번째 에러 - Attribute Error =모듈, 클래스에 있는 잘못된 속성 사용시에 나타난다.
- 7번째 에러 - Value Error = 참조 값이 없을 때 발생
- 8번째 에러 - File Not Found Error = 외부파일을 처리할 때 발생하는 에러
- 9번째 에러 - Type Error = 이 에러를 방지하기 위해 형변환을 잘 해야한다.

항상 예외가 발생하지 않을 것으로 가정하고 먼저 코딩한 후에 예외 발생시 예외 처리 코딩 권장 ( EAFP 코딩 스타일 )

예외 처리 기본
# try - 에러가 발생할 가능성이 있는 코드 실행
# except - 에러명1
# except - 에러명2
# else - 에러가 발생하지 않았을 경우 실행
# finally - 항상 실행

예외 처리 예01
name = ['Kim','Lee''Park']
try:
    z = 'Kim'
    x = name.index(z)
    print("{} Found it! in name".format(z, x+1))
except ValueError:
    print("Not fount it! - Occured ValueError!")
else:
    print("Ok! else")

어떤 오류가 발생할지 모를 경우 except만 적는다.
name = ['Kim''Lee''Park']
try:
    z = 'J'
    x = name.index(z)
    print("{} Found it! in name".format(z,x+1))
except:
    print("Not found it! - Occured Error!")
else:
    print("Ok! else")

[Finally]의 명령어는 실행의 여부와 관련없이 실행이 되는 코드이다.
try:
    z = 'Kim'
    x = name.index(z)
    print('{} Found it! in name'.format(z,x+1))
except:
    print("Not found it! - Occurred Error!")
else:
    print("Ok! else!")
finally:
    print("Finally ok!")

예외 처리(else)는 하지 않지만, 무조건 실행되는 코드의 패턴임으로 숙지해 놓는다.
try:
    print("try")
finally:
    print("Ok Finally!")

다중 예외처리의 코드 작성 방법은 다음과 같다. 그러나 코드작성시 코드의 순서를 감안하고 작성을 해야한다.
try:
    z = "Kim"
    x = name.index(z)
    print("{} Found it! in name".format(z, x+1))
except ValueError:
    print("Not fount it! - ValueError Error!")
except IndexError:
    print("Not found it! = IndexError Error!")
except Exception:
    print("Not found it! = Occurred Error!")
else:
    print("Ok! else!")
finally:
    print("finally ok!")

직접 예외를 설정할시 코드는 다음과 같이 작성된다. (고급문법)
try:
    a = '333'
    if a == 'Kim':
        print('Ok 허가!')
    else:
        raise ValueError
except ValueError:
    print('문제 발생!')
except Exception as f:
    print(f)
else:
    print('Ok!')

2020년 5월 14일 목요일

09. Python Basic - 파일 읽고, 쓰기

목표

- Open 함수
- 파일 모드의 이해
- 파일 읽기 실습
- 파일 쓰기 실습

# 읽기 모드 : r, 쓰기 모드(기존 파일 삭제): w, 추가 모드(파일 생성 또는 추가): a

외부 리소스를 불러왔을 때는 반드시 닫아줘야한다.
f = open('./resource/review.txt''r')
content = f.read()
print(content)
print(dir(f))
# 반드시 close 리소스 반환
f.close()

with 문을 활용했다면 자동으로 close가 된다.
# 예제2 [ with 문은 자동으로 close를 해준다 ]
with open('./resource/review.txt''r'as f:

한문장씩 읽어오고 싶다면 readline( ) 명령어를 사용한다.
with open('./resource/review.txt''r'as f:
    line = f.readline()
    print(line)

그러나 한 문장씩 여러번 읽어오고 싶다면 While문을 활용하여 반복한다.
with open('./resource/review.txt''r'as f:
    line = f.readline()
    while line:
        print(line, end="####")
        line = f.readline()

파일쓰기

파일 쓰는 방법 ( 새로운 이름의 텍스트 파일을 생성한다. ) - [ w ]
with open('./resource/text1.txt''w'as f:
    f.write('Niceman!\n')

파일을 추가 시키는 방법 - [ a ]
with open('./resource/text1.txt''a'as f:
    f.write("Goodman!")

코드 - [ randint ]는 랜덤의 int 즉 랜덤의 숫자를 생성하는 코드이다.
코드 - [ writelines ]는 리스트를 쓰는 명령어
with open('./resource/text3.txt''w'as f:
    list = ['Kim\n''Park\n''Cho\n']
    f.writelines(list)

Print 명령어를 활용하여 파일을 생성하는 코드
with open('./resource/text4.txt''w'as f:
    print('Test Contents1!'file=f)
    print('Test Contents2!'file=f)

08. Python Basic - 모듈과 패키지

학습 목표

1. 패키지 설정
2. 모듈 사용 및 Alias 설정
3. 패키지 사용 장점

..  : 부모 디렉토리로 이동
.   : 현재 디렉토리로 이동

Class를 활용한 패키지
from pkg.fibonacci import Fibonacci

Fibonacci.fib(300)
print("ex2: ", Fibonacci.fib2(400))
print("ex2: ", Fibonacci().title)

[import *] = 전체 클래스를 다 가져오겠다는 명령어 / 컴퓨터의 용량을 많이 사용되기 때문에 권장하지 않는다.
[import x, y] = 콤마(,)를 활용하여 다수의 클래스를 불러올 수 있다.

Alias을 활용하는 법
# 사용3(클래스) - Alias실행법 권장
from pkg.fibonacci import Fibonacci as fb
fb.fib(1000)
print("ex2: ", fb.fib2(1600))
print("ex2: ", fb().title)

함수를 활용한 패키지
#사용4(함수)
import pkg.calculations as c
print("ex4: ", c.add(10,100))
print("ex4: ", c.mul(10,100))

#사용5(함수) - 필요한 함수를 가져오는 방법
from pkg.calculations import div as d
print("ex5: "int(d(100,10)))

패키지 폴더 안에 [ __init__.py ] 패키지를 제작해 준다

패키지 안의 함수가 실행이 잘 되는지 테스트를 위한 코드
# 단위 실행 (독립적으로 파일 실행)
if __name__ == "__main__":
    prt1()
    prt2()