測試環境為 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