# 取得桃園UBike即時資訊 ###### tags: `python` `ubike` `topic` ## 簡介 要取得UBike資訊,需要透過「桃園開放資料」網站來取得,其網址如下: https://data.tycg.gov.tw/opendata/datalist/datasetMeta?oid=5ca2bfc7-9ace-4719-88ae-4034b9a5a55c 進入API(應用程式介面:Application Program Interface)網頁後,會看到其提供三種格式: - JSON:https://data.tycg.gov.tw/api/v1/rest/datastore/a1b4714b-3b75-4ff8-a8f2-cc377e4eaa0f?format=json - CSV:https://data.tycg.gov.tw/api/v1/rest/datastore/a1b4714b-3b75-4ff8-a8f2-cc377e4eaa0f?format=csv - XML:https://data.tycg.gov.tw/api/v1/rest/datastore/a1b4714b-3b75-4ff8-a8f2-cc377e4eaa0f?format=xml > **備註:** > > 此範例會選用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 ## 程式架構 #### 流程 ![](https://i.imgur.com/WUg94pX.png) #### Python模組 | 模組名稱 | 說明 | | -------- | ------------------------------------- | | requests | 存取網路上http協定資料 | | csv | 解析CSV格式檔案並轉成list格式(兩層) | ## 程式 #### 說明 ``` import requests import csv ``` 使用`import`指令引入需要的`requesta`和`csv`模組 ``` 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() else: print('取得ubike資料失敗.') ``` 使用`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 ```