source

sqlite 데이터베이스를 pandas 데이터프레임으로 열고 변환하는 방법

factcode 2023. 10. 6. 22:04
반응형

sqlite 데이터베이스를 pandas 데이터프레임으로 열고 변환하는 방법

sqlite 데이터베이스(data.db)로 몇 가지 데이터를 다운로드했는데 이 데이터베이스를 python에서 열고 팬더 데이터 프레임으로 변환하고 싶습니다.

여기까지입니다.

import sqlite3
import pandas    
dat = sqlite3.connect('data.db') #connected to database with out error
pandas.DataFrame.from_records(dat, index=None, exclude=None, columns=None, coerce_float=False, nrows=None)

하지만 이 오류를 던져주고 있습니다.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 980, in from_records
    coerce_float=coerce_float)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 5353, in _to_arrays
    if not len(data):
TypeError: object of type 'sqlite3.Connection' has no len()

sqlite 데이터베이스를 pandas 데이터프레임으로 변환하는 방법

sqlite는 Python Standard Library의 일부이며 SQLite 데이터베이스에 대한 쉽고 좋은 인터페이스임에도 불구하고 Pandas 튜토리얼은 다음과 같이 설명합니다.

참고 read_sql_table()을 사용하려면 SQL Lchemy 옵션 종속성이 설치되어 있어야 합니다.

그러나 SQLAlchemy를 설치하지 않으려면 Pandas는 여전히 sqlite3 액세스를 지원합니다.

import sqlite3
import pandas as pd
# Create your connection.
cnx = sqlite3.connect('file.db')

df = pd.read_sql_query("SELECT * FROM table_name", cnx)

여기에 명시되어 있지만, 사용한 테이블의 이름을 미리 알아야 합니다.

선을

data = sqlite3.connect('data.db')

데이터베이스에 대한 연결을 엽니다.여기까지 조회된 기록이 없습니다.그래서 당신은 나중에 질의를 실행해서 팬더들에게 이것을 제공해야 합니다.DataFrame시공자

이것과 비슷하게 보여야 합니다.

import sqlite3
import pandas as pd

dat = sqlite3.connect('data.db')
query = dat.execute("SELECT * From <TABLENAME>")
cols = [column[0] for column in query.description]
results= pd.DataFrame.from_records(data = query.fetchall(), columns = cols)

나는 SQL 명령어에 대해 잘 모르니 당신은 쿼리의 정확성을 확인해야 합니다. 당신의 데이터베이스에 있는 테이블의 이름이 되어야 합니다.

테이블 이름을 모르는 상태에서 sqlite.db를 데이터 프레임 사전으로 구문 분석:

def read_sqlite(dbfile):
    import sqlite3
    from pandas import read_sql_query, read_sql_table

    with sqlite3.connect(dbfile) as dbcon:
        tables = list(read_sql_query("SELECT name FROM sqlite_master WHERE type='table';", dbcon)['name'])
        out = {tbl : read_sql_query(f"SELECT * from {tbl}", dbcon) for tbl in tables}

   return out

서치sqlalchemy,engine구글의 데이터베이스 이름(이 경우 sqlite):

import pandas as pd
import sqlalchemy

db_name = "data.db"
table_name = "LITTLE_BOBBY_TABLES"

engine = sqlalchemy.create_engine("sqlite:///%s" % db_name, execution_options={"sqlite_raw_colnames": True})
df = pd.read_sql_table(table_name, engine)

나는 .sqlite나 .db와 같은 데이터베이스 파일에 테이블을 저장하고 그 중에서 각 테이블을 시트로 하여 엑셀 파일을 만들거나 개별 테이블을 csv로 만드는 코드를 작성했습니다.

참고: 테이블 이름을 미리 알 필요는 없습니다!

import os, fnmatch
import sqlite3
import pandas as pd

#creates a directory without throwing an error
def create_dir(dir):
  if not os.path.exists(dir):
    os.makedirs(dir)
    print("Created Directory : ", dir)
  else:
    print("Directory already existed : ", dir)
  return dir

#finds files in a directory corresponding to a regex query
def find(pattern, path):
    result = []
    for root, dirs, files in os.walk(path):
        for name in files:
            if fnmatch.fnmatch(name, pattern):
                result.append(os.path.join(root, name))
    return result



#convert sqlite databases(.db,.sqlite) to pandas dataframe(excel with each table as a different sheet or individual csv sheets)
def save_db(dbpath=None,excel_path=None,csv_path=None,extension="*.sqlite",csvs=True,excels=True):
    if (excels==False and csvs==False):
      print("Atleast one of the parameters need to be true: csvs or excels")
      return -1

    #little code to find files by extension
    if dbpath==None:
      files=find(extension,os.getcwd())
      if len(files)>1:
        print("Multiple files found! Selecting the first one found!")
        print("To locate your file, set dbpath=<yourpath>")
      dbpath = find(extension,os.getcwd())[0] if dbpath==None else dbpath
      print("Reading database file from location :",dbpath)

    #path handling

    external_folder,base_name=os.path.split(os.path.abspath(dbpath))
    file_name=os.path.splitext(base_name)[0] #firstname without .
    exten=os.path.splitext(base_name)[-1]   #.file_extension

    internal_folder="Saved_Dataframes_"+file_name
    main_path=os.path.join(external_folder,internal_folder)
    create_dir(main_path)


    excel_path=os.path.join(main_path,"Excel_Multiple_Sheets.xlsx") if excel_path==None else excel_path
    csv_path=main_path if csv_path==None else csv_path

    db = sqlite3.connect(dbpath)
    cursor = db.cursor()
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    tables = cursor.fetchall()
    print(len(tables),"Tables found :")

    if excels==True:
      #for writing to excel(xlsx) we will be needing this!
      try:
        import XlsxWriter
      except ModuleNotFoundError:
        !pip install XlsxWriter

    if (excels==True and csvs==True):
      writer = pd.ExcelWriter(excel_path, engine='xlsxwriter')
      i=0
      for table_name in tables:
          table_name = table_name[0]
          table = pd.read_sql_query("SELECT * from %s" % table_name, db)
          i+=1
          print("Parsing Excel Sheet ",i," : ",table_name)
          table.to_excel(writer, sheet_name=table_name, index=False)
          print("Parsing CSV File ",i," : ",table_name)
          table.to_csv(os.path.join(csv_path,table_name + '.csv'), index_label='index')

      writer.save()


    elif excels==True:
      writer = pd.ExcelWriter(excel_path, engine='xlsxwriter')
      i=0
      for table_name in tables:
          table_name = table_name[0]
          table = pd.read_sql_query("SELECT * from %s" % table_name, db)
          i+=1
          print("Parsing Excel Sheet ",i," : ",table_name)
          table.to_excel(writer, sheet_name=table_name, index=False)

      writer.save()

    elif csvs==True:
      i=0
      for table_name in tables:
          table_name = table_name[0]
          table = pd.read_sql_query("SELECT * from %s" % table_name, db)
          i+=1
          print("Parsing CSV File ",i," : ",table_name)
          table.to_csv(os.path.join(csv_path,table_name + '.csv'), index_label='index')
    cursor.close()
    db.close()
    return 0
save_db(); 

한다면data.dbSQLite 데이터베이스와table_name는 테이블 중 하나입니다. 그러면 다음 작업을 수행할 수 있습니다.

import pandas as pd
df = pd.read_sql_table('table_name', 'sqlite:///data.db')

다른 수입품은 필요 없습니다.

데이터를 데이터베이스에 저장했습니다.sqlite 테이블 이름은 Reviews입니다.

import sqlite3
con=sqlite3.connect("database.sqlite")

data=pd.read_sql_query("SELECT * FROM Reviews",con)
print(data)

언급URL : https://stackoverflow.com/questions/36028759/how-to-open-and-convert-sqlite-database-to-pandas-dataframe

반응형