iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 4
3
AI & Data

爬蟲在手、資料我有 - 30 天 Scrapy 爬蟲實戰系列 第 4

【Day 3】常見的資料格式 (2/3) - JSON

另一個常見的格式是 JSON (JavaScript Object Notation),可以想成是 Python 的 dictlist。Python 也有提供標準的模組來處理 JSON 格式的資料,這邊也介紹幾個常用到的 API。

  • 準備資料

一樣到 Mockaroo 來產資料,這次在 Format 的選項要選擇 JSON

https://ithelp.ithome.com.tw/upload/images/20190918/20107875btHGY4F73Z.png

  • 反序列化(decode)

json 模組提供兩個方法來反序列化(讀取) JSON 格式的資料,兩個方法只差在第一個參數,其他的參數都一樣:

  1. json.load:第一個參數需要支援 .read() 方法(通常是文字檔案二進位檔案實例)用來讀取資料。
  2. json.loads:第一個參數是 strbytesbytearray 實例。

反序列化時會依照下列表格,將 JSON 的資料型態轉換為 Python 的資料型態:

JSON Python
object dict
array list
string str
number(int) int
number(real) float
true True
false False
null None

參考以下程式碼:

import json
with open('mock_data.json', newline='') as jsonfile:
    data = json.load(jsonfile)
    # 或者這樣
    # data = json.loads(jsonfile.read())
    print(data)

https://ithelp.ithome.com.tw/upload/images/20190923/20107875lKdrpacep0.png

  • 序列化(encode)

json 模組也提供兩個方法來序列化(寫入) JSON 格式的資料,第一個參數都是要序列化的目標,兩個方法只差在第二個參數,其他的參數都一樣:

  1. json.dump:第二個參數需要支援 .write() 方法(通常是文字檔案二進位檔案實例)用來寫入資料。
  2. json.dumps:不需要第二個參數,會直接回傳 JSON 格式的 str 實例。

序列化時會依照下列表格,將 Python 的資料型態轉換為 JSON 的資料型態:

Python JSON
dict object
list, tuple array
str string
int, float, int- & float-derived Enums number
True true
False false
None null

參考以下程式碼:

import json
with open('mock_data.json', newline='') as jsonfile:
    data = json.load(jsonfile)

with open('mock_data.json', 'w', newline='') as jsonfile:
    data.append({ \
        'id': 5, \
        'first_name': 'Vin', \
        'last_name': 'Sturdgess', \
        'gender': 'Male', \
        'country': 'Greece' \
    })
    json.dump(data, jsonfile)
    # 或者這樣
    # jsonfile.write(json.dumps(data))

https://ithelp.ithome.com.tw/upload/images/20190923/20107875eIrCRkoTyn.png

不知道有沒有人發現, 序列化後的字串是沒有排版的,如果閱讀上有需要排版的話,可以在序列化時加上參數來處理。

json.dump(data, jsonfile) 換成 json.dump(data, jsonfile, indent=4),執行後再比較一下差別。

但排版後會增加儲存所需的空間跟傳輸量,通常是不建議在儲存時做排版的。

參考資料


上一篇
【Day 2】常見的資料格式 (1/3) - CSV
下一篇
【Day 4】常見的資料格式 (3/3) - HTML
系列文
爬蟲在手、資料我有 - 30 天 Scrapy 爬蟲實戰33

尚未有邦友留言

立即登入留言