IoT MQTT Panel APP相關文章:
建立連結:本社群由Nantou.py使用者社群以及國立虎尾科技大學電機資訊學院負責維護,它是一群熱愛智慧生活科技以及Python的專業教師所組成,大家一同快樂地研究有關數位生活中人工智慧、大數據、物聯網、雲端服務、APPS、福祉科技、感知網路服務、車載網路服務、及網際網路等資通訊技術,並運用這些資通訊以及Python技術來提升我們的日常生活品質,建立更好的生活環境。
2025年11月12日 星期三
2025年11月10日 星期一
[水井USR創新教材]Python一下用爬蟲技術取得環境開放式資料
API使用說明:https://data.moenv.gov.tw/paradigm
執行結果:
執行結果:
範例一:簡易介接
1 2 3 4 5 6 | import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) r=requests.get('https://data.moenv.gov.tw/api/v2/acidr_p_01?format=json&offset=0&limit=5&api_key=KEY值請申請', verify=False) print(r.text) |
執行結果:
{
"fields": [
{
"id": "siteid",
"type": "text",
"info": {
"label": "測站代碼"
}
},
{
"id": "sitename",
"type": "text",
"info": {
"label": "測站中文名稱"
}
},
<未完>
範例二:使用DataFrame
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import requests import urllib3 import pandas as pd import json urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) r=requests.get('https://data.moenv.gov.tw/api/v2/acidr_p_01?format=json&offset=0&limit=5&api_key=申請的KEY值', verify=False) print(r.text) data = json.loads(r.text) records = data.get("records", []) df = pd.DataFrame(records) print(df.head()) df_selected = df[[ "sitename", "county", "township", "monitor_date", "item_name", "result_value", "item_unit" ]] print(df_selected.head()) |
siteid sitename site_ename ... item_ename result_value item_unit
0 78 馬公 Magong ... RAIN_SUM 0 mm
1 77 金門 Kinmen ... RAIN_SUM 0 mm
2 75 馬祖 Matsu ... RAIN_SUM 0 mm
3 66 冬山 Dongshan ... RAIN_SUM 0 mm
4 64 陽明 Yangming ... RAIN_SUM 0 mm
[5 rows x 16 columns]
sitename county township monitor_date item_name result_value item_unit
0 馬公 澎湖縣 馬公市 20211230 雨量累計 0 mm
1 金門 金門縣 金城鎮 20211230 雨量累計 0 mm
2 馬祖 連江縣 南竿鄉 20211230 雨量累計 0 mm
3 冬山 宜蘭縣 冬山鄉 20211230 雨量累計 0 mm
4 陽明 臺北市 北投區 20211230 雨量累計 0 mm
[水井USR創新教材]Python一下用爬蟲技術協助水井村漁民取得市場交易行情
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import requests import urllib3 import json # 關閉 InsecureRequestWarning urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) url = 'https://data.moa.gov.tw/Service/OpenData/FromM/AquaticTransData.aspx' r = requests.get(url, verify=False) # 檢查 HTTP 狀態 if r.status_code != 200: print(f"資料取得失敗,HTTP 狀態碼:{r.status_code}") else: try: text = json.loads(r.text) for row in text: # 有些資料可能沒有「魚貨名稱」或「市場名稱」,需先檢查鍵存在 if '魚貨名稱' in row and '市場名稱' in row: if '吳郭魚' in row['魚貨名稱'] and '斗南' in row['市場名稱']: print('交易日期:' + str(row.get('交易日期', '無資料'))) print('品種代碼:' + str(row.get('品種代碼', '無資料'))) print('魚貨名稱:' + str(row.get('魚貨名稱', '無資料'))) print('市場名稱:' + str(row.get('市場名稱', '無資料'))) print('上價:' + str(row.get('上價', '無資料'))) print('中價:' + str(row.get('中價', '無資料'))) print('下價:' + str(row.get('下價', '無資料'))) print('交易量:' + str(row.get('交易量', '無資料'))) print('平均價:' + str(row.get('平均價', '無資料'))) print('-' * 40) except json.JSONDecodeError as e: print("JSON 解析錯誤:", e) except Exception as e: print("發生錯誤:", e) |
執行結果: 交易日期:1141109 品種代碼:1011 魚貨名稱:吳郭魚 市場名稱:斗南 上價:76.0 中價:63.6 下價:51.9 交易量:1631.0 平均價:63.8 ---------------------------------------- 交易日期:1141108 品種代碼:1011 魚貨名稱:吳郭魚 市場名稱:斗南 上價:76.7 中價:74.8 下價:72.5 交易量:1751.3 平均價:74.7 ---------------------------------------- 交易日期:1141107 品種代碼:1011 魚貨名稱:吳郭魚 市場名稱:斗南 上價:76.0 中價:66.6 下價:52.0 交易量:1636.3 平均價:65.6 ---------------------------------------- 交易日期:1141106 品種代碼:1011 魚貨名稱:吳郭魚 市場名稱:斗南 上價:76.0 中價:67.2 下價:59.3 交易量:1643.7 平均價:67.4 ---------------------------------------- 交易日期:1141105 品種代碼:1011 魚貨名稱:吳郭魚 市場名稱:斗南 上價:76.0 中價:63.4 下價:56.0 交易量:1593.1 平均價:64.5 ---------------------------------------- 交易日期:1141104 品種代碼:1011 魚貨名稱:吳郭魚 市場名稱:斗南 上價:76.0 中價:70.8 下價:63.6 交易量:1812.5 平均價:70.4 ---------------------------------------- 交易日期:1141102 品種代碼:1011 魚貨名稱:吳郭魚 市場名稱:斗南 上價:76.0 中價:64.0 下價:48.8 交易量:1704.5 平均價:63.4 ---------------------------------------- 交易日期:1141101 品種代碼:1011 魚貨名稱:吳郭魚 市場名稱:斗南 上價:76.0 中價:69.5 下價:58.1 交易量:1790.1 平均價:68.5 ----------------------------------------
[水井USR創新教材]Python一下用水井村故事學會 locals() 和 globals()
以下資訊是由ChatGPT協助生成:
在程式世界裡,
-
globals() 就像整個「水井村的地圖」🌏,記錄所有村子裡的名字(變數、函式、物件……)
-
locals() 就像「屋子裡的物品清單」🏠,只記錄某個房間(函式內部)的變數。
🏡範例 一、水井村全景地圖:globals()
水井村有許多居民與地標:烏龜、白馬、姻緣花。
這些都是「全域變數」,大家都能看到。
1 2 3 4 5 6 7 8 | # 水井村的全景地圖 village = "水井村" turtle = "烏龜" horse = "白馬" flower = "姻緣花" print("=== 水井村的全景地圖(globals) ===") print(globals().keys()) # 查看整個村子的地圖上有誰 |
執行結果:
=== 水井村的全景地圖(globals) ===
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', 'village', 'turtle', 'horse', 'flower'])
💡說明:
在這裡,它就像是整座村莊的登記簿。
globals() 會回傳一個字典(dict),裡面有所有全域變數的名字與內容。在這裡,它就像是整座村莊的登記簿。
🕳️ 範例二、進入烏龜的房間:locals()
現在,我們走進烏龜的房間。
裡面有牠自己的小物品(在地變數),這些東西村外的人看不到。
程式:
1 2 3 4 5 6 7 | def turtle_room(): food = "萵苣葉" toy = "石頭球" print("=== 烏龜房間裡的物品(locals) ===") print(locals()) # 查看房間裡的變數有哪些 turtle_room() |
執行結果:
=== 烏龜房間裡的物品(locals) ===
{'food': '萵苣葉', 'toy': '石頭球'}
💡說明:
locals() 只會顯示在函式內部定義的變數。
離開房間後,這些變數就不再存在。
🧭 範例三、結合使用:房間內外的界線
程式:
1 2 3 4 5 6 7 8 | treasure = "金井水" def white_horse(): tool = "竹掃帚" print("房間內能看到 globals 嗎?", "treasure" in globals()) print("房間內能看到 locals 嗎?", "tool" in locals()) white_horse() |
執行結果:
房間內能看到 globals 嗎? True
房間內能看到 locals 嗎? True
🧠 意思是:
函式裡面可以看到全村的變數(globals())。
但全村看不到你房間裡的私人物品(locals())。
💬 結論整理
名稱 範圍 比喻 說明
globals() 全域範圍 🌏 水井村地圖 存放所有村莊共用的資源
locals() 區域範圍 🏠 烏龜房間 存放函式內部的私有變數
可視範圍 函式內可看全域,全域看不到區域 🚪 單向門 保護變數,避免混亂
🎯 延伸任務(課堂練習)
請同學完成:
定義一個 love_story() 函式,裡面有 boy = "白馬"、girl = "姻緣花"。
- 在函式中列印出 locals()。
- 在外部列印出 globals()。
- 思考:函式外部能看到 boy 和 girl 嗎?
[水井USR創新教材]Python一下用水井三寶認識 Python 的 os 模組
以下教材是用ChatGPT生成。
在程式的世界裡,os 模組就像是我們在電腦裡旅行時的「導遊」,幫我們找到路、開資料夾、搬東西、檢查有沒有東西存在。
我們來看看三位主角——烏龜、白馬、姻緣花——是怎麼幫助我們理解 os 模組的!
範例一:🐢 烏龜:穩重的導覽員(os.getcwd / os.chdir)
烏龜總是走得慢但很穩,它最擅長「知道自己在哪裡」。
程式碼:
1 2 3 4 5 6 7 8 | import os # 烏龜看看自己現在在哪個資料夾 print("烏龜現在在:", os.getcwd()) # 烏龜想要換到另一個資料夾 os.chdir("C:/Users") # 換路徑 print("烏龜移動後的位置:", os.getcwd()) |
執行結果:
烏龜現在在: C:\Users\cheng-min\AppData\Local\Programs\Python\Python313
烏龜移動後的位置: C:\Users
🗣 烏龜的智慧:
「知道當前路徑,才能慢慢走向下一個目標。」
白馬速度快、效率高,最擅長整理與搬運檔案。
程式碼:
1 2 3 4 5 6 7 8 9 10 11 | import os # 白馬看看這裡有哪些東西 print("白馬看到的東西:", os.listdir()) # 白馬替主人開一個新資料夾 os.mkdir("姻緣花資料夾") # 白馬幫忙確認檔案有沒有存在後再刪掉 if os.path.exists("舊檔案.txt"): os.remove("舊檔案.txt") |
白馬看到的東西: ['AquaticTransData.docx', 'AquaticTransData.xlsx', 'DLLs', 'Doc', 'grades.xlsx', 'grades_final.xlsx', 'guess.py', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'ollama1.py', 'ollama2.py', 'ollama3.py', 'ollama4.py', 'open.py', 'open2.py', 'python.exe', 'python3.dll', 'python313.dll', 'pythonw.exe', 'Scripts', 'suijing_sanbao', 'tcl', 'template.docx', 'template.py', 'test.py', 'test2.py', 'ttsx.py', 'vcruntime140.dll', 'vcruntime140_1.dll', '__pycache__']
🗣 白馬的智慧:
「行動力就是力量!想整理資料,就用我的蹄子吧~」
範例三:🌸 姻緣花:串起緣分的橋樑(os.path.join / os.path.exists)
姻緣花最會「牽線」——她能把不同的路徑串起來,讓一切有緣相會。
程式:
1 2 3 4 5 6 7 8 9 10 11 | import os # 姻緣花幫兩段路徑牽在一起 path = os.path.join("C:/Users", "Documents", "水井村") print("姻緣花牽起的路徑:", path) # 看看這條緣分路上是否真的存在 if os.path.exists(path): print("這條路是真的有緣~") else: print("緣分還沒到,資料夾不存在。") |
執行結果:
姻緣花牽起的路徑: C:/Users\Documents\水井村
緣分還沒到,資料夾不存在。
🗣 姻緣花的智慧:
「連結,是一切的開始。」
💡小結論
| 角色 | 功能 | 對應 os 模組函式 |
|---|---|---|
| 🐢 烏龜 | 了解與改變當前位置 | os.getcwd()、os.chdir() |
| 🐎 白馬 | 整理、建立與刪除資料 | os.listdir()、os.mkdir()、os.remove() |
| 🌸 姻緣花 | 串接路徑與檢查存在 | os.path.join()、os.path.exists() |
🎯延伸任務(適合課堂練習)
請同學們寫一個「水井三寶自動巡邏程式」:
- 讓烏龜顯示目前位置。
- 讓白馬建立一個新資料夾 三寶任務。
- 讓姻緣花檢查資料夾是否存在並印出結果。
訂閱:
意見 (Atom)
