(1) Python with CSV
(2) CSV 에 있는 데이터를 Python 으로 INSERT
엑셀 파일 과 같은 구조화된 표 데이터를 다른 사람에게 전달하거나 내가 보기 좋게 저장하는 과정에서 CSV 파일을 많이 활용을 한다.
CSV 파일은 comma, 즉 쉼표로 행과 열 데이터가 구분되어져 구조화되어 있는 파일을 의미한다.
Python 에서는 이 CSV 파일을 Python으로 불러와서 Pandas 와 같은 라이브러리로
CSV 파일 내에 있는 데이터를 분석 할 수 있다.
또는 아래와 같이 CSV 파일을 Python으로 불러와서 CSV 파일 내의 데이터들을 MySql
데이터베이스에 연결하여 존재하는 테이블 내에 값(value)를 INSERT 할수도 있다.
🖍️ READ CSV
# police_station.csv 파일을 불러와 pandas로 읽어와서 데이터를 확인한다.
import pandas as pd
df = pd.read.csv("police_station.csv")
df.head()
df = pd.read_csv("police_station.csv") : pd.read.csv("police_station.csv") 는 police_station.csv 라는 이름의 CSV(콤마로 구분된 값) 파일을 pd 판다스 라이브러리로 읽어와 만든 데이터프레임을 df에 저장한다. #police_station.csv 실제 데이터 구성
서울특별시경찰청,서울시 종로구 사직로8길 31
서울중부경찰서,서울특별시 중구 수표로 27
서울종로경찰서,서울특별시 종로구 율곡로 46
서울남대문경찰서,서울특별시 중구 한강대로 410
서울서대문경찰서,서울특별시 서대문구 통일로 113
서울혜화경찰서,서울특별시 종로구 창경궁로 112-16
서울용산경찰서,서울특별시 용산구 원효로89길 24
🖍️ CSV에 있는 데이터 PYTHON으로 INSERT
# AWS RDS MYsql 내에 있는 Zerobase 데이터베이스에 연결
import mysql.connector
conn = mysql.connector.connect(
host = ""database-l.cwz ...",
port = 3306,
user = "zero",
password = "password"
database = "zerobase"
)
# 데이터베이스와 연결된 Cursor 만들기, 읽어올 양이 많은 경우 cursor 생성 시 buffer=True 설정을 해준다
cursor = conn.cursor(buffered=True)
# Zerobast 데이터 베이스 내에 있는 police_station 테이블에
# police_station.csv의 값(valuse)를 삽입 위한 INSERT 문 만들기
# %s는 csv 파일의 값(values)를 string, 즉 문자열로 받겠다는 것이다.
sql = "INSERT INTO police_station VALUES (%s, %s)"
# 데이터 값(valuse) 입력
for i, row in df.iterrows():
cursor.execute(sql, tuple(row))
print(tuple(row))
conn.commit()
sql = "INSERT INTO police_station VALUES (%s, %s)":
INSERT쿼리를 실행하여 데이터베이스 내polcie_station에값(values)및 데이터를 삽입하는 쿼리를sql변수에 담아주는 것이다. 위의 코드에서%s는SQL쿼리에 데이터를 삽입할 위치를 나타내는 것이며police_station테이블에 넣을 값의 위치를 나타내는 것이다.
(%s, %s)는 쿼리 실행을 할 때 쓰이는 파라미터 변수인sql로 전달될 두 개의 값(values)가 들어갈 자리로 실제 값을 전달할 때 이 자리 표시자들은 튜플 형태로 값을 받게 되며 튜플의 값들이 괄호 첫 번째, 두 번째 처럼 순서대로 대입되게 된다.%s는 각 값을 전달받을 때 문자열로 받겠다는 것이다.
for i, row in df.iterrows(): cursor.execute(sql, tuple(row)):
iterrows():
Pandas DataFrame에서 각 행을 반복하는 메서드이다. 이 메서드를 호출하면 지정한police_station.csv데이터가 담겨있는df데이터 프레임의 각 행-열과 데이터 정보를tuple형태의 객체로 반복해서 반환한다. 보통 (행 이름 또는 행 인덱스, 내용의 Series객체) 형태로 반환하는데,Series객체는 열-값 형태로 반환된다.
for i, row in df.iterrows():
iterrows()매서드로 호출한police_station.csv데이터의 행 인덱스와 행의 값을 담고 있는sereise객체를 각각i와row라고 지칭해 각df데이터프레임의 각 행에 대한 특정 작업을 수행할 수 있게 되는 것이다. 행의 값(values)이 여러개 이기 때문에for반복문을 사용해df.iterrows로 인해 반환된 다수의 튜플 값(values)을 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입하여 수행할 명령문에 사용할 수 있게 되는 것이다.
cursor.execute(sql, tuple(row)):첫 번째 파라미터 및 매개변수인
sql은 데이터베이스에 전달하고 실행할sql쿼리를 나타내고, 두 번째 파타미터 및 매개션수인tuple(row)는sql에서 시행할 쿼리에 대입할 실제 값들을 담고 있는 튜플이라고 할 수 있다.
여기서tuple(row)는for i, row in df.iterrows()에서 반환된police_station.csv데이터의 행의 값을 담고 있으며tuple()을 실행함으로써row에 담겨 있는 각 행의 값을 튜플로 변환하는 것이다.이후
execute()메서드가 실행되면, 데이터베이스에 전달하고 쿼리를 실행할 첫 번째 파라미터 및 매개변수인sql에sql에서 시행할 쿼리에 대입할 실제 값들을 담고 있는 튜플tuple(row)가 전달되는 작업이 시행되게 된다.
-참고자료
https://rfriend.tistory.com/601
https://wikidocs.net/158775
https://go-for-data.tistory.com/entry/01SQLBulkInsert
https://yurimkoo.github.io/python/2019/09/14/connect-db-with-python.html