M0 資料的一生
- 說出 Python、JupyterLab、JSON、YAML 各自負責甚麼;
- 認出同一份資料的 JSON 寫法和 YAML 寫法;
- 分清楚「檔案裏的文字」和「Python 裏的物件」;
- 在 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
這門課的每個單元,都是在這個循環的某一段上加深理解。
2四樣工具,各管一段 Four tools, four jobs
| 工具 | 它是甚麼 | 在旅程裏負責 |
|---|---|---|
| JSON | 一種把資料寫成文字的格式 | 檔案:程式之間交換資料 |
| YAML | 另一種把資料寫成文字的格式,給人讀寫為主 | 檔案:設定檔 |
| Python | 一種程式語言 | 讀入、整理、寫出 |
| JupyterLab | 一個在瀏覽器裏執行 Python 的工作環境 | 一步一步做、即時看到結果 |
前兩樣是格式,回答「資料在檔案裏長甚麼樣子」;後兩樣是工具,回答「你用甚麼去處理它」。
3同一份資料,兩種寫法 Same data, two spellings
下面是同一本書的資料,左邊用 JSON 寫,右邊用 YAML 寫。內容完全一樣:書名、頁數、是否已出版、標籤、作者。
留意兩者標出「結構」的方法不同:
- JSON 用
{ }包住一組「名稱:值」,用[ ]包住一串值,字串一律加雙引號; - YAML 用縮排表示「屬於上一層」,用
-表示「一串裏的一項」,字串通常不用引號。
在 YAML 裏多一格或少一格空白,資料的意思就變了,而且不一定會報錯。JSON 的縮排則只是為了好看,刪掉也不影響內容。M9 會專門處理這個陷阱。
4文字與物件 Text and objects
無論是 JSON 還是 YAML,檔案裏只有文字。Python 讀入檔案時,會把這些文字「翻譯」成記憶體裏的物件,最常見的是 dict(字典)和 list(串列)。寫出時則反過來,把物件翻譯回文字。
在 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
- 下載本單元的三個練習檔:
m0-first-look.ipynb、book.json、book.yaml,放在同一個資料夾; - 在該資料夾裏開啟 JupyterLab(M1 會詳細講安裝,現在可以先用學校電腦或 JupyterLite 試用);
- 打開
m0-first-look.ipynb,由上而下逐個 cell 按Shift+Enter執行。
完成後,你會親眼看到圖 3 的兩個方向:JSON 和 YAML 讀入後得到同一個 dict。
同一個概念,換成實驗室的資料:一個溫度感測器的設定和讀數。下載 m0-sensor-eng.ipynb、sensor.json、sensor.yaml,做法同上。它還會讓你看到 YAML 的註解在讀入時去了哪裏。
M1 會處理「Python 從哪裏來」:直譯器、套件和虛擬環境。