[SQL] : Python with MySQL (5) - Python with CSV / CSV 에 있는 데이터를 Python 으로 INSERT // execute, Cursor, Pandas, tuple, iterrows

김대현·2024년 6월 12일

(1) Python with CSV
(2) CSV 에 있는 데이터를 Python 으로 INSERT

(1) Python with CSV

  • 엑셀 파일 과 같은 구조화된 표 데이터를 다른 사람에게 전달하거나 내가 보기 좋게 저장하는 과정에서 CSV 파일을 많이 활용을 한다.

  • CSV 파일은 comma, 즉 쉼표로 행과 열 데이터가 구분되어져 구조화되어 있는 파일을 의미한다.

  • Python 에서는 이 CSV 파일을 Python으로 불러와서 Pandas 와 같은 라이브러리로
    CSV 파일 내에 있는 데이터를 분석 할 수 있다.

  • 또는 아래와 같이 CSV 파일을 Python으로 불러와서 CSV 파일 내의 데이터들을 MySql
    데이터베이스에 연결하여 존재하는 테이블 내에 값(value)INSERT 할수도 있다.



(2) CSV 에 있는 데이터를 Python 으로 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 변수에 담아주는 것이다. 위의 코드에서 %sSQL 쿼리에 데이터를 삽입할 위치를 나타내는 것이며 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 객체를 각각 irow 라고 지칭해 각 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() 메서드가 실행되면, 데이터베이스에 전달하고 쿼리를 실행할 첫 번째 파라미터 및 매개변수인 sqlsql에서 시행할 쿼리에 대입할 실제 값들을 담고 있는 튜플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

profile
데이터 분석 스쿨 블로그 입니다.

0개의 댓글