Try   HackMD

取得桃園UBike即時資訊

tags: python ubike topic

簡介

要取得UBike資訊,需要透過「桃園開放資料」網站來取得,其網址如下:

https://data.tycg.gov.tw/opendata/datalist/datasetMeta?oid=5ca2bfc7-9ace-4719-88ae-4034b9a5a55c

進入API(應用程式介面:Application Program Interface)網頁後,會看到其提供三種格式:

備註:

此範例會選用CSV格式。

資料欄位說明

索引 欄位名稱 說明
0 sareaen 行政區英文名
1 sarea 行政區中文名
2 lng 經度
3 sna 中文站名
4 snaen 英文站名
5 bemp 空位數量
6 ar 中文地址
7 act 全站禁用狀態(0:禁用、1:啟用)
8 sno 站編號
9 aren 英文地址
10 tot 場站總停車格
11 _id 資料編號
12 sbi 場站目前車輛數量
13 mday 微笑單車各場站來源資料更新時間
14 lat 緯度

資料來源:

https://data.gov.tw/dataset/137993

程式架構

流程

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Python模組

模組名稱 說明
requests 存取網路上http協定資料
csv 解析CSV格式檔案並轉成list格式(兩層)

程式

說明

import requests
import csv

使用import指令引入需要的requestacsv模組

url = 'https://data.tycg.gov.tw/api/v1/rest/datastore/a1b4714b-3b75-4ff8-a8f2-cc377e4eaa0f?format=csv'

設定要取得資料的目標網址

response = requests.get(url)

連線該網址並取得資料,結果會存於response變數中

補充:
不管成功或失敗,其資料和狀態都會存在response中

if response.status_code == requests.codes.ok:

判斷取得該網址資料是否結果成功還是失敗。

rows = response.text.splitlines()

取得回傳的資料並將每一行切該存成一個list

補充:
因為這裡取得資料為CSV格式,所以需要先一行一行切開

user = input('請輸入要尋找的UBike廠站名稱:')

取得使用者輸入

data = list(csv.reader(rows))

上面切開為list的資料,交給csv模組,來將每一筆資料再使用逗點來切開成一個新的list,回傳的資料需再轉成list型態。

補充:
此時的list會是一個兩層的list

for row in data:

透過迴圈一筆一筆資料取出來

if(user in row[3]):
    print(f'站名:{data[3]}, 地址: {row[6]}')
    print(f' - 可借: {row[12]}')
    print(f' - 可還: {row[5]}')
    print()

使用in語法判斷使用者個輸入文字有沒有在該筆資料的第四個欄位中(也就是站名),有的話就以print函式來顯示該站台的完整名稱、地址、可借、可還數量。

補充:
最下面一個完全沒有輸出文字的print()只是單純為了多換一行

完整程式碼

import requests
import csv

url = 'https://data.tycg.gov.tw/api/v1/rest/datastore/a1b4714b-3b75-4ff8-a8f2-cc377e4eaa0f?format=csv'

response = requests.get(url)

if response.status_code == requests.codes.ok:
​   rows = response.text.splitlines()
​   
​   # 接收使用者輸入
​   user = input('請輸入要尋找的UBike廠站名稱:')

​   data = list(csv.reader(rows))
​   
​   for row in data:
​       if(user in row[3]):
​           print(f'站名:{row[3]}, 地址: {row[6]}')
​           print(f' - 可借: {row[12]}')
​           print(f' - 可還: {row[5]}')
​           print(f' - 總數: {row[10]}')
​           print()
else:
​   print('取得ubike資料失敗.')

執行範例

請輸入要尋找的UBike廠站名稱:火車站
站名:中壢火車站(前站), 地址: 中和路109號空地
 - 可借: 4
 - 可還: 75

站名:中壢火車站(後站), 地址: 新興路68-94號對面人行道
 - 可借: 12
 - 可還: 31

站名:桃園火車站(後站), 地址: 延平路26號對面人行道
 - 可借: 23
 - 可還: 66

站名:桃園火車站(前站), 地址: 中正路1號面火車站右方人行道
 - 可借: 42
 - 可還: 57

延伸練習

  1. 嘗試在查詢結果中加上顯示「該Ubike站腳踏車總量的資訊」

    例如:

    ​​​請輸入要尋找的UBike廠站名稱:火車站
    ​​​站名:中壢火車站(前站), 地址: 中和路109號空地
    ​​​ - 可借: 46
    ​​​ - 可還: 34
    ​​​ - 總數: 94
    ​​​
    ​​​站名:中壢火車站(後站), 地址: 新興路68-94號對面人行道
    ​​​ - 可借: 10
    ​​​ - 可還: 95
    ​​​ - 總數: 106
    ​​​
    ​​​站名:桃園火車站(後站), 地址: 延平路26號對面人行道
    ​​​ - 可借: 33
    ​​​ - 可還: 34
    ​​​ - 總數: 70
    ​​​
    ​​​站名:桃園火車站(前站), 地址: 中正路1號面火車站右方人行道
    ​​​ - 可借: 0
    ​​​ - 可還: 64
    ​​​ - 總數: 66