Python 資料全景課 / 第一部分 建立心智模型 · M0

M0 資料的一生

一份資料從檔案走進 Python、在 JupyterLab 裏被看清楚、再寫回檔案。這門課的四樣工具,各管這段旅程的一段。
約 30 分鐘練習 notebook 1 個
學完本單元,你能夠:
  1. 說出 Python、JupyterLab、JSON、YAML 各自負責甚麼;
  2. 認出同一份資料的 JSON 寫法和 YAML 寫法;
  3. 分清楚「檔案裏的文字」和「Python 裏的物件」;
  4. 在 JupyterLab 裏打開第一個 notebook,執行一個 cell。

1一份資料的旅程 The journey of a piece of data

日常工作裏的資料,很少是一開始就放在 Python 裏的。它通常先以檔案的形式存在:一份設定檔、一個網站回傳的結果、一份別人傳給你的匯出檔。這些檔案最常見的格式,就是 JSON 和 YAML。

拿到檔案之後,你要做的事大致是同一個循環:

flowchart LR
    A[("檔案<br/>JSON/YAML")] -->|讀入| B["Python 物件<br/>dict、list"]
    B --> C["探索與整理<br/>在 JupyterLab 裏"]
    C -->|寫出| D[("新的檔案<br/>報告、設定")]
    classDef file fill:#f1f1ef,stroke:#d3d1cb,color:#37352f
    classDef step fill:#ffffff,stroke:#d3d1cb,color:#37352f
    class A,D file
    class B,C step
圖 1 資料的旅程。灰色是檔案,白色是在 Python 裏進行的步驟;JupyterLab 是你做這些步驟的地方。

這門課的每個單元,都是在這個循環的某一段上加深理解。

2四樣工具,各管一段 Four tools, four jobs

工具 它是甚麼 在旅程裏負責
JSON 一種把資料寫成文字的格式 檔案:程式之間交換資料
YAML 另一種把資料寫成文字的格式,給人讀寫為主 檔案:設定檔
Python 一種程式語言 讀入、整理、寫出
JupyterLab 一個在瀏覽器裏執行 Python 的工作環境 一步一步做、即時看到結果

前兩樣是格式,回答「資料在檔案裏長甚麼樣子」;後兩樣是工具,回答「你用甚麼去處理它」。

3同一份資料,兩種寫法 Same data, two spellings

下面是同一本書的資料,左邊用 JSON 寫,右邊用 YAML 寫。內容完全一樣:書名、頁數、是否已出版、標籤、作者。

圖 2 同一份資料的兩種寫法。JSON 用括號和引號標出結構;YAML 用縮排和「- 」標出結構。
圖 2 同一份資料的兩種寫法。JSON 用括號和引號標出結構;YAML 用縮排和「- 」標出結構。

留意兩者標出「結構」的方法不同:

YAML 的縮排就是結構

在 YAML 裏多一格或少一格空白,資料的意思就變了,而且不一定會報錯。JSON 的縮排則只是為了好看,刪掉也不影響內容。M9 會專門處理這個陷阱。

4文字與物件 Text and objects

無論是 JSON 還是 YAML,檔案裏只有文字。Python 讀入檔案時,會把這些文字「翻譯」成記憶體裏的物件,最常見的是 dict(字典)和 list(串列)。寫出時則反過來,把物件翻譯回文字。

圖 3 檔案和物件之間的翻譯。讀入(load)把文字變成物件;寫出(dump)把物件變成文字。兩種格式最後都變成同一個 Python dict。
圖 3 檔案和物件之間的翻譯。讀入(load)把文字變成物件;寫出(dump)把物件變成文字。兩種格式最後都變成同一個 Python dict。

在 Python 裏,這兩個方向各是一行:

import json

with open("book.json", encoding="utf-8") as f:
    book = json.load(f)      # 文字 → 物件

print(book["title"])         # 看得見的資料
print(book["tags"][0])       # python

book 讀入之後,就和 JSON 或 YAML 再沒有關係了。它只是一個普通的 Python dict;從 JSON 讀還是從 YAML 讀,得到的物件是一樣的。

重點

格式只存在於檔案裏。整理資料的工夫,全部在 Python 物件上做;格式只在讀入和寫出的那一刻才重要。

5容易混淆 Easily confused

這兩樣 分別
Python 和 JupyterLab Python 是語言;JupyterLab 是執行 Python 的其中一個地方。同一段程式也可以在終端機或 VS Code 裏執行。
JSON 和 Python dict JSON 是檔案裏的文字;dict 是記憶體裏的物件。兩者長得很像,但 JSON 的 true、null 在 Python 裏寫作 True、None。
JSON 和 YAML 都是把資料寫成文字的格式。JSON 嚴格、適合程式之間交換;YAML 寬鬆、適合人寫設定檔。
notebook 和 .py 檔 notebook(.ipynb)把程式、輸出和說明文字存在同一個檔案裏;.py 檔只有程式。

6動手:第一個 notebook Hands-on: your first notebook

  1. 下載本單元的三個練習檔:m0-first-look.ipynb、book.json、book.yaml,放在同一個資料夾;
  2. 在該資料夾裏開啟 JupyterLab(M1 會詳細講安裝,現在可以先用學校電腦或 JupyterLite 試用);
  3. 打開 m0-first-look.ipynb,由上而下逐個 cell 按 Shift+Enter 執行。

完成後,你會親眼看到圖 3 的兩個方向:JSON 和 YAML 讀入後得到同一個 dict。

工程線(選做)

同一個概念,換成實驗室的資料:一個溫度感測器的設定和讀數。下載 m0-sensor-eng.ipynb、sensor.json、sensor.yaml,做法同上。它還會讓你看到 YAML 的註解在讀入時去了哪裏。

下一步

M1 會處理「Python 從哪裏來」:直譯器、套件和虛擬環境。