PythonとSQLite3とPandasでTableの作成とTableの出力

概要

Pandasを使用してcsvfileをSQLite3へ読み込み、及び、
Pandasを使用してcsvfileへSQLite3を書き出し。

Pandas視点で言えば、
Pandasでcsvfileを読み込みSQLite3へ書き出し、及び、
PandasでSQLite3を読み込みcsvfileへ書き出し。

Pandas API

タブ区切りのファイルから読み込み:read_table

タブ区切りのファイルから読み込み:read_csvで引数sep='\t'
タブ区切りのファイルへの書き出し:DataFrame.to_csvで引数sep='\t'

カンマ区切りのファイルから読み込み:read_csv
カンマ区切りのファイルへの書き出し:DataFrame.to_csv

Excelファイルから読み込み:read_excel
JSONファイルから読み込み:read_json
HTMLファイルから読み込み:read_html
XMLファイルから読み込み:read_xml
Excelファイルへの書き出し:DataFrame.to_excel
JSONファイルへの書き出し:DataFrame.to_json
HTMLファイルへの書き出し:DataFrame.to_html
XMLファイルへの書き出し:DataFrame.to_xml

SQLから読み込み:read_sql
SQLから読み込み:read_sql_query
SQLから読み込み:read_sql_table
SQLへの書き出し:DataFrame.to_sql


pandas.read_sql_tableのconは「SQLite DBAPI 接続モードはサポートされていません」とのこと。故に、
pandas.read_sqlsqlでtable_nameを指定してもエラーになる、のだと思われる...

入力データ(sample.csv)

220 220.0 nico 2022/02/20
221 221.1 nuke 2022/02/21
222 222.2 neko 2022/02/22

出力データ(result.csv)

ID Ver Name Date
220 220.0 nico 2022/02/20 00:00:00
221 221.1 nuke 2022/02/21 00:00:00
222 222.2 neko 2022/02/22 00:00:00

Pythonコード

import sqlite3

import pandas as pd


def main():

    print("PRESS ENTER KEY TO BOOT")
    input()

    con = None
    cur = None

    try:
        con = sqlite3.connect(":memory:")
        cur = con.cursor()

        pd.read_csv(
            "hello_sqlite_pandas_sample.csv",
            encoding="cp932",
            header=None,
            names=[
                "ID",
                "Ver",
                "Name",
                "Date",
            ],
            dtype={
                "ID": "int64",
                "Ver": "float64",
                "Name": "string",
            },
            parse_dates=[
                "Date",
            ],
        ).to_sql("Sample", con, index=False)

        pd.read_sql("SELECT * FROM Sample", con).to_csv("hello_sqlite_pandas_result.csv", encoding="cp932", index=False)

    except Exception as e:
        print(e)
    finally:
        cur = cur.close() if cur is not None else None
        con = con.close() if con is not None else None

    print()
    print("PRESS ENTER KEY TO EXIT")
    input()


if __name__ == "__main__":
    main()


入力データに日本語は含まれていませんが、
当方環境がWindowsなので文字コードエンコードをcp932にしています。

Link1

Python documentation
https://docs.python.org/3/
Python Standard Library
https://docs.python.org/3/library/
sqlite3 - DB-API 2.0 interface for SQLite databases
https://docs.python.org/3/library/sqlite3.html

sqlite documentation
https://www.sqlite.org/docs.html
List Of PRAGMAs
https://www.sqlite.org/pragma.html#toc
Datatypes In SQLite
https://www.sqlite.org/datatype3.html

pandas documentation
https://pandas.pydata.org/docs/
pandas api input/output
https://pandas.pydata.org/docs/reference/io.html
pandas api reference pandas.read_csv
https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
pandas api reference pandas.read_sql
https://pandas.pydata.org/docs/reference/api/pandas.read_sql.html
pandas api reference pandas.DataFrame.to_csv
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html
pandas api reference pandas.DataFrame.to_sql
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_sql.html
pandas api user guide dtypes
https://pandas.pydata.org/docs/user_guide/basics.html#basics-dtypes

Link2

SQLite入門
https://www.javadrive.jp/
https://www.javadrive.jp/sqlite/

SQLiteはどこが凄いデータベース管理システムなのか調べてみた
https://qiita.com/ko1nksm/items/87d27a287e1b6005d11c

python3でsqlite3の操作。作成や読み出しなどの基礎。
https://qiita.com/saira/items/e08c8849cea6c3b5eb0c
SQLite3のためのSQLリファレンス
https://qiita.com/tetr4lab/items/691ceeb528d6144547c8

SELECT文の評価順序の話
https://qiita.com/suzukito/items/edcd00e680186f2930a8
SQL記述者全員が理解すべきSELECT文の論理的な処理順序のお話
https://qiita.com/k_0120/items/a27ea1fc3b9bddc77fa1

SQL サブクエリ入門
https://qiita.com/aki3061/items/6df0513ccc5aa40a075a
SQL サブクエリ編
https://qiita.com/sho91/items/0de49ba749952ee5cb22

SQLiteで日付時刻を扱う際のポイント
https://qiita.com/TomK/items/132831ab45e2aba822a8
SQLite3 で created_at, updated_at
https://qiita.com/kerupani129/items/0372ea29d9375e55bb36

あとがき

ノンプログラマーの素人が記述をしたコードです。
狭い利用範囲と少ない利用頻度での確認ですので、
記載内容に間違いや勘違いがあるかもしれません。
上記内容を参照の際は自己責任でお願い致します。