2016年9月10日 星期六

Python學習筆記_資料處理(如何存取OpenData)

之前同事賴姐問我mongodb,原因是他收到的資料是JSON格式,於是乎我推薦了她C#的JSON.NET,只是事情永遠都是那麼巧合,過沒幾天我發現之前用的UBIKE網址是舊的,而新的網址的內容使用R語言去解析相當的困難,時間又來不及。
資料內容長這樣

有沒有又快又彈性的方式呢?我想了一下,想到Python這個玩意,於是在網路上Google一下,發現這篇,喔耶,於是小弟拿了他的程式改了一下,其中最麻煩的地方是小弟的版本已經是Python3.4了,而且又是在Windows上執行,所以有遇到轉碼的問題,'cp950' codec can't encode character 'OOXX' in position.... 。小弟花費了一些時間處理轉碼問題並將資料轉入資料庫,果然是吉人自有天相呀!^^
小弟的流程如下,先使用urllib.request套件將資料下載本地端,在使用pypyodbc套件將資料傳入資料庫。
#getBike.py 
#!/usr/bin/env python
import urllib.request
import gzip
import json
import sys
import pypyodbc
#from pprint import pprint
url = "http://data.taipei/youbike"
urllib.request.urlretrieve(url, "YouBikeTP.gz")
f = gzip.open('YouBikeTP.gz', 'r')
#先轉碼,處理編碼問題(CP950)
jdata = f.read().decode('utf-8').encode(sys.stdin.encoding, 'replace').decode(sys.stdin.encoding)
f.close()
data = json.loads(jdata)
connection = pypyodbc.connect(r'Driver={SQL Server};Server=.;Database=OpenDataDB;Trusted_Connection=yes;')
cursor = connection.cursor()
for key,value in data["retVal"].items():
    sno = value["sno"]
    sna = value["sna"]
    tot = value["tot"]
    sbi = value["sbi"]
    sarea = value["sarea"]
    mday = value["mday"]
    lat = value["lat"]
    lng = value["lng"]
    ar = value["ar"]
    sareaen = value["sareaen"]
    snaen = value["snaen"]
    aren = value["aren"]
    bemp = value["bemp"]
    act = value["act"]
    cursor.execute("insert into tempTabUbike values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", (sno,sna,tot,sbi,sarea,mday,lat,lng,ar,sareaen,snaen,aren,bemp,act))
connection.commit()
connection.close()

有圖有真相

搞定收工!^^
PS:寫這篇希望有幫到賴姐!

沒有留言:

張貼留言