본문 바로가기
디스코드 봇 제작법/심화 봇 개발

💻 csv와 pandas로 유사 db 만들기

by 뒬탕 2022. 1. 21.
반응형

만들게 된 계기

 주로 replit으로 토이 프로젝트를 돌리는데 db가 필요했다. sql은 설치 못하고(할 수 있나? 안 해봐서 모르겠다) 엑셀은 무겁고 json은 복잡했다. 그래서 csv랑 pandas로 대충 쓸 정도로 만들었다.

 

전체 코드

import pandas as pd
import os
import csv

csv_data = {}

def get_column(csv_name):
  global csv_data

  return csv_data[csv_name].columns.to_list()

def get_index(csv_name):
  global csv_data

  return csv_data[csv_name].index.to_list()

def new(csv_name, columns_list):
  global csv_data

  file_list = os.listdir('./csv_db')
  if f"{csv_name}.csv" in file_list:
    return False

  with open(f'csv_db/{csv_name}.csv', 'w') as new_csv:
    input_column = '|'.join(['index']+columns_list) + '\n'

    new_csv.write(input_column)

  csv_data[csv_name] = pd.read_csv(f"csv_db/{csv_name}.csv", index_col=0, sep='|')

  return True

def append(csv_name, idx, *input_list):
  global csv_data

  columns = csv_data[csv_name].columns
  add_column = pd.DataFrame([input_list], columns=columns, index=[idx])
  csv_data[csv_name] = csv_data[csv_name].append(add_column)
  
  csv_data[csv_name].to_csv(f"csv_db/{csv_name}.csv", sep='|')

def read_all(csv_name):
  global csv_data

  return csv_data[csv_name]

def read_one(csv_name, idx):
  global csv_data

  try:
    result = csv_data[csv_name].loc[idx]
  except:
    result = None

  return result

def read_dot(csv_name, idx, column):
  global csv_data

  try:
    result = csv_data[csv_name].loc[idx, column]
  except:
    result = None

  return result

def read_select(csv_name, column_index, value):
  global csv_data
  
  try:
    df = csv_data[csv_name]
    result = df[df[column_index] == value]
  except:
    result = None

  return result

def update(csv_name, idx, column, data):
  global csv_data

  csv_data[csv_name].loc[idx, column] = data
  csv_data[csv_name].to_csv(f"csv_db/{csv_name}.csv", sep='|')

def delete(csv_name, idx):
  global csv_data

  csv_data[csv_name] = csv_data[csv_name].drop(idx)
  csv_data[csv_name].to_csv(f"csv_db/{csv_name}.csv", sep='|') # ['']

def main():
  global csv_data

  file_list = os.listdir('./csv_db')
  for file_name in file_list:
    if file_name[-3:] == 'csv':
      csv_data[file_name[:-4]] = pd.read_csv(f"csv_db/{file_name}", index_col=0, sep='|')

  print(csv_data)

main()

https://github.com/dilttan/pseudoDB

 

코드 설명

Create

  • new(csv_name, columns_list) : csv_db 폴더에 테이블을 하나 만든다
  • append(csv_name, idx, *input_list) : 해당 테이블에 한 행 추가시킨다

 

Read

  • read_all(csv_name) : 해당 테이블 전체를 불러온다
  • read_one(csv_name, idx) : 한 행만 불러온다
  • read_dot(csv_name, idx, column) : 한 점만 불러온다
  • read_select(csv_name, column_index, value) : 해당 열의 값이 해당 값인 경우만 불러온다

 

Update

  • update(csv_name, idx, column, data) : 한 점의 데이터를 바꾼다

 

Delete

  • delete(csv_name, idx) : 한 행을 지운다

 

또 언제든지 궁금한 내용이 있으면 댓글을 달아주시거나
화면 왼쪽 아래의 디스코드 아이콘을 누르면 실시간으로 답해드립니다!
(아이콘이 보이지 않는다면 에드 블록을 꺼주세요)

Feed & Back 서버 아바타
https://discord.link/feedbackblog

또 위 초대 링크를 눌러 Feed & Back 서버에 들어오시면
블로그의 새 글을 알림 받고
디스코드, 디코 봇 프로그래밍에 대해 질문할 수 있어요!
반응형
그리드형

댓글