2019年12月13日 星期五

[Python]輕量級資料庫SQLite之介紹 : 擷取政府網站上的Open Data實作為例

目標:

  • 擷取政府網頁上提供的開放資料(Open Data),並將資料儲存至SQLite資料庫中。

輕量級資料庫 SQLite 簡介 (SQLite官網)

  • 免費資料庫。 
  • 支援 C/C++、JAVA、Python 等常見程式語言。 
  • 入門相較於微軟、Oracle資料庫容易。 
  • 主要整合在用戶端程式中,作為本地端儲存資料的常見選擇,像是手機的APP應用程式、嵌入式系統、IOT等所使用。 
  • 具有跨平台優點。 
  • 容易安裝。 
  • 所需的記憶體空間很小(依不同平台,469kbyte~ 11 Mbyte 左右)。 
  • 檔案型資料庫,備份容易。

開放資料 (Open Data)

  • 經過挑選與許可的資料。
  • 這種資料不受著作權、專利權,以及其他管理機制所限制。 
  • 入門相較於微軟、Oracle資料庫容易。 
  • 可以開放給社會公眾,任何人都可以自由出版使用,不論是要拿來出版或是做其他的運用都不加以限制。 
以上對於Open Data的說明來自(WiKi百科)

政府的開放資料 (Open Data) 平臺(官網)


開放資料上常見資料交換格式

  • CSV :逗號分隔值(Comma-Separated Values, CSV)有時也稱為字元分隔值,因為分隔字元也可以不是逗號。 
  • 圖片資料來源(web)

  • XML :可延伸標記式語言(Extensible Markup Language, XML),是一種標記式語言。標記指電腦所能理解的資訊符號,通過此種標記,電腦之間可以處理包含各種資訊的文章等。  
  • 圖片資料來源(web)

  • JSON: 全名為JavaScript Object Notation ,是一種輕量級的資料交換格式,純文字檔且易於閱讀。 

圖片資料來源(web)

程式功能:擷取宜蘭縣加油站資料儲存至 SQLite 資料庫中

  • 擷取加油站的公開資訊。 
  • 儲存到 SQLite資料庫。 

圖片資料來源(web)

程式實作開始


# 作者資訊
__Author__ = 'fatdodo'
# 載入擷取剖析網頁相關套件
import requests 
import json
# 擷取網頁資料
url  = 'http://www.ilepb.gov.tw/api/ILEPB01001/format/JSON'
resp = requests.get(url)
# 資料總長度(字數)
print(len(resp.text))
# 輸出資料 { key : value}
print(resp.text)
# 將JSON文字檔轉譯成符合 Python 字典檔資料
json_dict = json.loads(resp.text)
# 依關鍵字(key)儲存對映的資料(value)
data = list()
for i in range(len(json_dict)):
    t = (json_dict[i]['加油站名稱'], 
         json_dict[i]['加油站地址'], 
         json_dict[i]['負責人'], 
         json_dict[i]['聯絡電話'])
    data.append(t)
# 印出資料(value)內容
for i in data:
    print(i)
# 建立資料庫與連線資料庫
import sqlite3
  • 由於筆者是使用Anaconda內的Jupyter Notebook,本身就有SQLite套件,直接載入SQLite資料庫套件即可。
# 建立資料庫 # dbname : 資料庫名稱。
dbname = 'gas_station.db'
# db : 建立與資料連線,如果資料庫不存在,會自動創建該資料庫。
db = sqlite3.connect(dbname)
# cursor : 可稱為資料指標,要查詢某一筆紀錄必須將cursor指標指到它。
cursor  = db.cursor()                
# 建立資料表 # dbtname : 資料表名稱。
dbtname = 'ilan'
- sql : 用來從資料庫讀取與儲存資料的資料庫特殊語法。
- ID : 資料的索引值。
- GAS : 加油站名稱。
- ADDR : 加油站地址。
- OWNER : 加油站負責人。
- TEL : 加油站電話號碼。
sql = '''CREATE TABLE {:s}(
         ID INTEGER PRIMARY KEY AUTOINCREMENT,
         GAS TEXT NOT NULL, 
         ADDR TEXT NOT NULL, 
         OWNER  TEXT NOT NULL,
         TEL TEXT);'''.format(dbtname)
# 在資料庫內建立資料表
try:
    cursor.execute(sql)
except Exception as e:
    print(e)
# 將加油站資料寫入資料庫中
sql = 'INSERT INTO {:s} (GAS, ADDR, OWNER, TEL) VALUES (?,?,?,?);'.format(dbtname)

try:
    cursor.executemany(sql, data)
    db.commit()
except Exception as e:
    print(e)
# 秀出資料庫資料表ilan內容
def show_recs(myc):
    sql = 'SELECT * FROM {:s} ORDER BY id ASC;'.format(dbtname)
    try:
        myc.execute(sql)
        recs = myc.fetchall()
        print('_____總共有:{:d} 筆____'.format(len(recs)))
        for i, rec in enumerate(recs, 1):
            print(i, '>', rec)
    except Exception as e:
        print(e)
show_recs(cursor)
# 關閉連線資料庫
cursor.close()

1 則留言: