本篇作為筆記用途,記錄 Python 參考資料
Python Script 基礎實作手冊
1. Python Script 是什麼
Python Script 是使用 Python 撰寫並直接執行的程式檔案,副檔名通常為:
1 | .py |
Python Script 常見用途包括:
- 自動處理檔案
- 轉換 JSON、CSV、Excel 等資料
- 呼叫 HTTP API
- 執行排程工作
- 批次更新資料
- 建立命令列工具
- 串接資料庫或雲端服務
- 自動產生報表
一個最簡單的 Python Script:
1 | print("Hello, Python") |
將程式儲存成:
1 | hello.py |
執行:
1 | python hello.py |
部分環境可能需要使用:
1 | python3 hello.py |
2. 安裝與環境確認
2.1 確認 Python 版本
1 | python --version |
輸出範例:
1 | Python 3.14.0 |
2.2 使用虛擬環境
每個 Python 專案建議建立獨立的虛擬環境,避免套件版本互相影響。
建立虛擬環境:
1 | python -m venv .venv |
Windows 啟用:
1 | .venv\Scripts\Activate.ps1 |
Windows 命令提示字元:
1 | .venv\Scripts\activate.bat |
Linux 或 macOS:
1 | source .venv/bin/activate |
停用虛擬環境:
1 | deactivate |
2.3 安裝套件
1 | pip install requests |
將目前套件輸出成檔案:
1 | pip freeze > requirements.txt |
依照套件清單安裝:
1 | pip install -r requirements.txt |
3. Python 基本語法
3.1 註解
註解是寫給開發者閱讀的說明文字,不會被 Python 當成程式執行。
單行註解
Python 使用 # 撰寫單行註解:
1 | # 顯示歡迎訊息 |
也可以寫在程式碼後方:
1 | timeout = 30 # HTTP API 逾時秒數 |
行尾註解應保持簡短。較長的說明應放在程式碼上方。
1 | # API 最多等待 30 秒,避免服務無回應時 |
多行註解
Python 沒有專用的多行註解語法。多行註解通常是在每一行前面加上 #:
1 | # 取得遠端使用者資料 |
部分程式碼會使用三個引號:
1 | """ |
三引號通常應用於文件字串,而不是一般註解。
文件字串 Docstring
Docstring 用來說明模組、函式、類別或方法的用途。
函式 Docstring
1 | def calculate_total(price: float, quantity: int) -> float: |
較完整的寫法:
1 | def calculate_total(price: float, quantity: int) -> float: |
類別 Docstring
1 | class ApiClient: |
模組 Docstring
模組說明通常放在 .py 檔案最上方:
1 | """ |
註解原則
- 使用
#撰寫一般註解。 - 使用 Docstring 說明模組、類別與函式。
- 說明程式採用某種做法的原因。
- 不要逐行翻譯明顯的程式碼。
- 不要長期保留大量被註解掉的舊程式碼。
- 修改程式碼時同步更新註解。
- API 限制、資料格式與相容性處理應留下說明。
- 複雜程式應優先改善命名與結構,而不是用大量註解補救。
3.2 變數
Python 不需要事先宣告變數型別。
1 | name = "Poy" |
3.3 常見資料型別
| 型別 | 說明 | 範例 |
|---|---|---|
str |
字串 | "Python" |
int |
整數 | 100 |
float |
浮點數 | 3.14 |
bool |
布林值 | True |
list |
清單 | [1, 2, 3] |
tuple |
不可變序列 | (1, 2, 3) |
dict |
鍵值資料 | {"name": "Poy"} |
set |
不重複集合 | {1, 2, 3} |
None |
空值 | None |
查看資料型別:
1 | value = 100 |
輸出:
1 | <class 'int'> |
3.4 型別提示
Python 支援型別提示,建議在正式專案中使用。
1 | name: str = "Poy" |
函式也可以標示參數及回傳型別:
1 | def calculate_total(price: float, quantity: int) -> float: |
型別提示不會在執行時強制檢查,但能提高可讀性,並協助 IDE 找出錯誤。
4. 字串處理
4.1 字串串接
1 | first_name = "Poy" |
4.2 f-string
建議使用 f-string 組合字串。
1 | name = "Poy" |
4.3 常用字串操作
1 | text = " Python Script " |
切割字串:
1 | value = "apple,banana,orange" |
輸出:
1 | ["apple", "banana", "orange"] |
組合字串:
1 | items = ["apple", "banana", "orange"] |
5. 資料轉型
資料轉型是 Python Script 中最常見的工作之一,特別是在處理 API、CSV、環境變數或使用者輸入時。
5.1 字串轉整數
1 | text = "123" |
必須注意字串內容必須是有效整數:
1 | text = "12.5" |
以上程式會發生 ValueError。
若字串是小數,可以先轉成 float:
1 | text = "12.5" |
結果為:
1 | 12 |
int() 會直接移除小數部分,不會四捨五入。
四捨五入:
1 | number = round(12.5) |
5.2 字串轉浮點數
1 | text = "99.95" |
5.3 數字轉字串
1 | number = 100 |
使用 f-string 通常更方便:
1 | number = 100 |
5.4 字串轉布林值
不建議直接使用:
1 | bool("false") |
因為只要字串不是空字串,結果都是 True。
正確做法:
1 | def to_bool(value: str) -> bool: |
使用:
1 | enabled = to_bool("true") |
5.5 安全轉型
外部資料可能包含空值或錯誤格式,因此應加入錯誤處理。
1 | def to_int(value: object, default: int = 0) -> int: |
使用:
1 | print(to_int("123")) |
輸出:
1 | 123 |
5.6 字串轉日期
1 | from datetime import datetime |
常見格式:
| 格式碼 | 說明 |
|---|---|
%Y |
四位數年份 |
%m |
月份 |
%d |
日期 |
%H |
24 小時制的小時 |
%M |
分鐘 |
%S |
秒 |
日期時間轉字串:
1 | from datetime import datetime |
5.7 ISO 8601 日期轉型
API 經常使用 ISO 8601 格式:
1 | 2026-07-31T10:30:00+08:00 |
可以使用:
1 | from datetime import datetime |
6. List 資料處理
6.1 建立 List
1 | numbers = [1, 2, 3, 4, 5] |
6.2 取得元素
1 | numbers = [10, 20, 30] |
6.3 新增與移除元素
1 | items = ["A", "B"] |
6.4 使用迴圈
1 | items = ["apple", "banana", "orange"] |
同時取得索引:
1 | for index, item in enumerate(items): |
6.5 List Comprehension
將數字乘以二:
1 | numbers = [1, 2, 3, 4, 5] |
篩選偶數:
1 | numbers = [1, 2, 3, 4, 5, 6] |
字串轉整數:
1 | values = ["10", "20", "30"] |
6.6 使用 map 與 filter
1 | values = ["1", "2", "3"] |
篩選:
1 | numbers = [1, 2, 3, 4, 5, 6] |
一般情況下,List Comprehension 通常比 map 和 filter 更容易閱讀。
7. Dictionary 資料處理
Dictionary 是 Python 中處理結構化資料的重要型別,也是 JSON 解析後最常見的型別。
7.1 建立 Dictionary
1 | user = { |
7.2 取得欄位
1 | print(user["name"]) |
當欄位不存在時,使用 [] 會產生 KeyError。
較安全的方式:
1 | name = user.get("name") |
指定預設值:
1 | phone = user.get("phone", "") |
7.3 修改資料
1 | user["name"] = "Poy Chang" |
7.4 移除欄位
1 | user.pop("email", None) |
7.5 遍歷 Dictionary
1 | for key, value in user.items(): |
7.6 轉換欄位名稱
假設原始資料:
1 | source = { |
轉換成新的資料結構:
1 | target = { |
8. 條件判斷
1 | score = 85 |
判斷空值:
1 | value = None |
判斷 List 是否為空:
1 | items = [] |
Python 中常見的假值包括:
1 | False |
9. 函式
9.1 建立函式
1 | def greet(name: str) -> str: |
使用:
1 | message = greet("Poy") |
9.2 預設參數
1 | def greet(name: str, prefix: str = "Hello") -> str: |
1 | print(greet("Poy")) |
9.3 關鍵字參數
1 | def create_user(name: str, age: int, enabled: bool) -> dict: |
呼叫:
1 | user = create_user( |
9.4 不定數量參數
1 | def calculate_total(*numbers: float) -> float: |
1 | print(calculate_total(10, 20, 30)) |
10. 錯誤處理
10.1 try-except
1 | try: |
10.2 finally
1 | try: |
10.3 主動拋出錯誤
1 | def calculate_price(price: float) -> float: |
10.4 不要任意忽略所有錯誤
不建議:
1 | try: |
這種寫法會隱藏真正的問題。
較適當的方式:
1 | try: |
11. 檔案處理
11.1 讀取文字檔案
1 | from pathlib import Path |
11.2 寫入文字檔案
1 | from pathlib import Path |
11.3 逐行讀取
1 | from pathlib import Path |
11.4 追加內容
1 | from pathlib import Path |
11.5 檢查檔案是否存在
1 | from pathlib import Path |
11.6 建立目錄
1 | from pathlib import Path |
12. JSON 資料處理
JSON 是 HTTP API 最常見的資料格式。
12.1 JSON 字串轉 Dictionary
1 | import json |
12.2 Dictionary 轉 JSON 字串
1 | import json |
ensure_ascii=False 可以避免中文字被轉換成 Unicode 跳脫字元。
12.3 讀取 JSON 檔案
1 | import json |
12.4 寫入 JSON 檔案
1 | import json |
13. CSV 資料處理
13.1 讀取 CSV
假設 users.csv:
1 | id,name,age |
讀取:
1 | import csv |
CSV 讀取後的欄位預設都是字串。
進行資料轉型:
1 | converted_users = [ |
13.2 寫入 CSV
1 | import csv |
utf-8-sig 通常能讓 Windows Excel 正確辨識 UTF-8 中文內容。
14. 呼叫 HTTP API
Python 可以使用內建的 urllib,也可以使用第三方套件 requests。
一般腳本建議使用 requests,語法較簡潔。
安裝:
1 | pip install requests |
14.1 HTTP GET
1 | import requests |
timeout 應該明確設定,避免 API 沒有回應時程式永久等待。
14.2 解析 JSON 回應
1 | import requests |
raise_for_status() 會在 HTTP 狀態碼為 4xx 或 5xx 時拋出例外。
14.3 Query String 參數
1 | import requests |
實際請求可能會變成:
1 | https://api.example.com/users?page=1&pageSize=20&keyword=Python |
14.4 設定 HTTP Header
1 | import requests |
14.5 Bearer Token 驗證
1 | import requests |
不要將正式 API Key 或 Token 直接寫在程式碼中。
建議從環境變數讀取:
1 | import os |
Windows PowerShell 設定環境變數:
1 | $env:API_TOKEN = "your-access-token" |
14.6 HTTP POST JSON
1 | import requests |
使用 json=payload 時,requests 會自動:
- 將 Dictionary 轉換成 JSON
- 設定
Content-Type: application/json
14.7 HTTP PUT
1 | import requests |
14.8 HTTP PATCH
1 | import requests |
14.9 HTTP DELETE
1 | import requests |
14.10 HTTP API 錯誤處理
1 | import requests |
15. 使用 Session 重複呼叫 API
當程式需要多次呼叫相同服務時,可以使用 requests.Session。
1 | import requests |
Session 可以重複使用 TCP 連線,也可以共用:
- Header
- Cookie
- 驗證資訊
- Proxy 設定
16. API 分頁處理
許多 API 會分頁回傳資料。
1 | import requests |
實際分頁欄位可能是:
1 | items |
必須依照 API 文件調整。
17. API 重試機制
網路錯誤、服務暫時無法使用或流量限制可能造成 API 呼叫失敗。
1 | import time |
不應對所有錯誤無條件重試。例如:
400 Bad Request401 Unauthorized403 Forbidden404 Not Found
這些通常無法透過重試解決。
18. 環境變數與設定
18.1 讀取環境變數
1 | import os |
提供預設值:
1 | api_url = os.getenv( |
18.2 驗證必要設定
1 | import os |
使用:
1 | api_token = get_required_environment_variable( |
19. Logging
正式腳本不建議全部使用 print()。
1 | import logging |
錯誤發生時記錄 Stack Trace:
1 | try: |
20. 命令列參數
可以使用內建的 argparse 接收命令列參數。
1 | import argparse |
執行:
1 | python app.py --output users.json --page-size 50 |
21. Python Script 標準入口
建議使用以下結構:
1 | def main() -> int: |
這種寫法有幾個優點:
- 程式流程清楚
- 可以被其他模組匯入
- 可以使用結束碼表示成功或失敗
- 容易進行單元測試
錯誤結束:
1 | def main() -> int: |
22. 完整範例:呼叫 API、轉型並輸出 JSON
以下範例會:
- 從環境變數取得 API 設定
- 呼叫 HTTP API
- 驗證回傳格式
- 進行資料轉型
- 將結果輸出為 JSON 檔案
- 記錄執行過程
1 | import json |
Windows PowerShell 執行:
1 | $env:API_URL = "https://api.example.com" |
23. 模組拆分
當腳本規模變大時,不要將所有程式放在同一個檔案。
建議結構:
1 | python-script/ |
converters.py:
1 | from typing import Any |
app.py:
1 | from converters import to_int |
24. 使用 dataclass 建立資料模型
Dictionary 很方便,但大型專案中容易因欄位名稱錯誤而產生問題。
可以使用 dataclass:
1 | from dataclasses import dataclass |
建立物件:
1 | user = User( |
轉成 Dictionary:
1 | from dataclasses import asdict |
25. 使用 pandas 進行大量資料轉型
若需要處理大量表格資料,可以使用 pandas。
安裝:
1 | pip install pandas |
讀取 CSV:
1 | import pandas as pd |
欄位轉型:
1 | dataframe["id"] = ( |
篩選資料:
1 | enabled_users = dataframe[ |
輸出 CSV:
1 | dataframe.to_csv( |
輸出 JSON:
1 | dataframe.to_json( |
對於少量資料或簡單腳本,Python 原生的 csv、list 和 dict 已經足夠。只有在需要大量表格運算時才需要導入 pandas。
26. 常見錯誤
26.1 縮排錯誤
Python 使用縮排表示程式區塊。
錯誤:
1 | if True: |
正確:
1 | if True: |
建議統一使用四個空格,不要混用 Tab 與空格。
26.2 None 與空字串混淆
1 | value = None |
表示沒有值。
1 | value = "" |
表示有一個字串,但內容為空。
26.3 CSV 欄位都是字串
即使 CSV 中的內容是:
1 | 100 |
讀取後仍然是:
1 | "100" |
必須自行轉型:
1 | number = int(row["id"]) |
26.4 API 沒有設定 Timeout
不建議:
1 | requests.get(url) |
建議:
1 | requests.get( |
26.5 將 API Token 寫入原始碼
不建議:
1 | token = "production-secret-token" |
建議:
1 | import os |
26.6 忽略 HTTP 狀態碼
不建議:
1 | response = requests.get(url) |
建議:
1 | response = requests.get( |
26.7 使用可變物件作為預設參數
不建議:
1 | def add_item(item, items=[]): |
建議:
1 | def add_item( |
27. 程式碼風格建議
變數與函式使用 snake_case:
1 | user_name = "Poy" |
類別使用 PascalCase:
1 | class ApiClient: |
常數使用大寫:
1 | DEFAULT_TIMEOUT_SECONDS = 30 |
Boolean 變數使用具有判斷意義的名稱:
1 | is_enabled = True |
避免過短或意義不明的變數:
1 | x = get_data() |
改成:
1 | user_records = get_user_records() |
28. 建議學習順序
第一階段:
- 變數與資料型別
- 字串處理
list與dict- 條件判斷
for與while- 函式
- 錯誤處理
第二階段:
- 檔案讀寫
- JSON
- CSV
- 資料轉型
- 命令列參數
- Logging
- 模組拆分
第三階段:
- HTTP API
- 驗證與 Token
- 分頁
- 重試
- Timeout
- 資料模型
- 單元測試
29. 實作練習
練習一:CSV 轉 JSON
需求:
- 讀取
users.csv - 將
id和age轉成整數 - 移除姓名前後空白
- 將 Email 轉成小寫
- 輸出成
users.json
練習二:呼叫 API 並保存資料
需求:
- 從環境變數讀取 API URL
- 呼叫 GET API
- 設定 30 秒 Timeout
- 驗證 HTTP 狀態碼
- 解析 JSON
- 將結果輸出到檔案
練習三:批次資料轉換
原始資料:
1 | records = [ |
轉換後:
1 | [ |
30. 重點整理
撰寫 Python Script 時,應掌握以下原則:
- 使用 Python 3
- 每個專案建立虛擬環境
- 使用型別提示提高可讀性
- 外部資料必須進行驗證及轉型
- CSV 欄位預設都是字串
- JSON 通常會轉換成
dict或list - 呼叫 HTTP API 必須設定 Timeout
- 使用
raise_for_status()檢查 HTTP 錯誤 - API Token 應放在環境變數
- 使用
try-except處理可預期錯誤 - 正式腳本使用
logging取代大量print - 使用
main()管理程式入口 - 程式變大後應拆分成多個模組
- 資料量不大時優先使用 Python 原生功能
- 只有在大量表格運算時才導入 pandas
參考資料: