Python – Export SQLite AS CSV File

Loading

測試環境為 CentOS8 (虛擬機)

怎麼透過 Python 把 SQLiet 的資料匯出成 CSV 格式(CommSeparated Values 以逗號做區隔)的檔案.

我這邊有一個 SQLite 的檔案,裡面有一個資料表 cpu_meminfo 用來記錄目前 CPU 與 MEM 的使用率 (監控系統可以透過 Python 的 psutil 套件來做 – https://benjr.tw/105251

[root@localhost ~]# ll mydatabase.db
-rw-r--r-- 1 root root 55 Feb  1 16:24 mydatabase.db
[root@localhost ~]# sqlite3
SQLite version 3.26.0 2018-12-01 12:34:55
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .open mydatabase.db
sqlite> SELECT * FROM cpu_meminfo;
CPU|0.1|2022-10-06 10:36:43
MEM|1.7|2022-10-06 10:36:43
CPU|0.0|2022-10-06 10:36:53
MEM|1.7|2022-10-06 10:36:53
CPU|0.4|2022-10-06 10:37:03
MEM|1.7|2022-10-06 10:37:03
sqlite> ^Z
[8]+  Stopped                 sqlite3
[root@localhost ~]# python3
Python 3.6.8 (default, Sep 21 2021, 20:17:36)
[GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.

以下程式碼是問 ChatGPT 提供的.

import sqlite3
import csv

# 連接資料庫
conn = sqlite3.connect("mydatabase.db")
cursor = conn.cursor()

# 執行 SELECT 語句並取得結果
cursor.execute("SELECT * FROM cpu_meminfo")
rows = cursor.fetchall()

# 寫入 CSV 檔案
with open("output.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(rows)

# 關閉資料庫連接
conn.close()

下面來說明一下程式碼.

匯入 sqlite3 與 csv 套件功能.

>>> import sqlite3
>>> import csv

透過 sqlite3.connect 連線到資料庫檔案,沒有該資料庫檔案時會自動建立在現行路徑.

>>> conn = sqlite3.connect("mydatabase.db")

回傳 conn 為 sqlite3.Connection 物件.

透過剛剛建立的 conn 物件來建立 cursoe 物件.

>>> cursor = conn.cursor()

之後就可以透過這個 sqlite3.Cursor 物件來執行 SQL Query.

>>> cursor.execute("SELECT * FROM cpu_meminfo")
<sqlite3.Cursor object at 0x7fee59fbc260>

透過 cursoe 物件 fetchall method 讀取所有資料.

>>> rows = cursor.fetchall()

輸出值為 list .

>> rows
[('CPU', '0.0', '2022-10-06 10:36:43'), ('MEM', '1.7', '2022-10-06 10:36:43'), ('CPU', '0.1', '2022-10-06 10:36:53'), ('MEM', '1.7', '2022-10-06 10:36:53'), ('CPU', '0.1', '10:37:03'), ('MEM', '1.7', '2022-10-06 10:36:32'), ('CPU', '0.1', '10:37:03')]

使用 with 語法時,可以免除自行編寫 try 與 finially, 詳細請參考 – https://benjr.tw/104769
使用 File 物件 & Open 函式模式為 w – Write 寫入模式(當檔案不存在時新增檔案,檔案存在時覆寫原檔案),詳細請參考 – https://benjr.tw/104316

>>> with open("output.csv", "w", newline="") as f:

使用 csv 模組的 writer functions 回傳值為 writer 物件,輸入值可以為任何有 write() method 的物件 (這邊的 f 為 file 物件).

...     writer = csv.writer(f)

使用剛剛產生的 writer 物件, 寫入所有資料到檔案,這邊 rows ( 須為 iterable object , 資料為 list 是 iterable object ) 為剛剛透過 cursoe 物件 fetchall method 讀取所有資料.

...     writer.writerows(rows)

關閉資料庫連線.

>>> conn.close()
>>>
[3]+  Stopped                 python3

檢視一下剛剛產生的 output.csv

[root@localhost ~]# ll output.csv
-rw-r--r-- 1 root root 56 Feb  1 16:27 output.csv
[root@localhost ~]# cat output.csv
CPU,0.1,2022-09-16 10:26:13
MEM,0.5,2022-09-16 10:26:13
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料