Learning Objectives
- 認識標準函式庫(Standard Library)、內建常數與內建函數
- sys 模組:命令列引數 sys.argv、模組搜尋路徑 sys.path、sys.exit()
- os 模組:os.getcwd()、os.listdir()、os.path 系列函數,以及更名與刪除檔案
標準函式庫:Python 內建的工具箱
安裝 Python 時就附帶了一套標準函式庫(Standard Library),涵蓋檔案、日期、數學、網路、文字處理等各種常見需求,
import 就能用,不必另外安裝。其中有用 C 寫成、能存取系統功能的內建模組,也有用 Python 寫成的模組。
有些東西甚至不用 import:
- 內建常數:
True、False(布林值),以及None(代表「沒有值」,類似其他語言的null) - 內建函數:
print()、len()、range()、type()、int()、open()、dir()、sorted()……共約 70 個
本課介紹兩個和「執行環境」最相關的模組:
| 模組 | 用途 |
|---|---|
sys |
取得或修改 Python 執行時的環境資訊:命令列引數、模組搜尋路徑、結束程式 |
os |
與作業系統互動的跨平台介面:目錄、檔案更名與刪除、路徑處理 |
暖身:內建常數 None
下面的程式會印出什麼?
lst = ["apple", None, 77, "", 123]
for item in lst:
if item is not None:
print(repr(item), end=" ")
sys.argv:命令列引數
在終端機執行 python argv.py aaa bbb ccc 時,sys.argv 是一個串列:第一個元素一定是程式名稱,其餘依序是收到的引數,全部都是字串。CodeLab 沙盒裡程式名稱固定顯示為 main.py;下方可以改引數(一行一個)再跑一次。
sys.exit():提早結束程式
這支程式需要一個引數,這次執行時沒有給。sys.exit(2) 會引發 SystemExit 例外來結束程式,引數是結束碼(exit code):0 代表成功,非 0 代表有錯誤。下方在引數欄填一行 data 再跑一次。
sys.path 與 sys.version_info
上一課提過,import 依 sys.path 串列裡的順序尋找模組;第一個位置是主程式所在的目錄。sys.path 是普通的串列,程式執行中也可以加入新的搜尋路徑。
在終端機傳入命令列引數
CodeLab 用「引數」欄位模擬命令列;在自己的電腦上,是在終端機的程式名稱後面直接接上引數。下面的 argv.py 與 listdir.py 就是上面兩個動畫的程式。
-
1
執行 argv.py 並傳入三個引數
引數之間用空白隔開。這次
sys.argv[0]是真正的程式名稱argv.py。 -
2
引數含有空白,或是數字
用引號包起來的會算成一個引數;數字也是以字串傳進來,要計算時記得
int()。 -
3
沒給引數:看結束碼
listdir.py需要一個目錄名稱。沒給時印出使用說明並sys.exit(2)。在 macOS/Linux 用echo $?查看上一個程式的結束碼(Windows 命令提示字元用echo %ERRORLEVEL%)。 -
4
列出上一層目錄
..代表上一層目錄,.代表目前目錄。下面的檔案清單只是範例,會依你的電腦而不同。 -
5
sys.platform 與 sys.version
sys.platform是平台識別字,例如'linux'、'win32'、'darwin'(macOS);sys.version是 Python 直譯器的版本與編譯資訊(每台電腦不同)。
想一想:sys
在終端機執行 python calc.py 3 5,程式裡 sys.argv[2] 是什麼?
執行 python hello.py(沒有任何引數),len(sys.argv) 是多少?
os 模組:與作業系統互動
os 提供跨平台(portable)的作業系統功能;這些函數出錯時會引發 OSError 例外
(例如找不到檔案的 FileNotFoundError 就屬於 OSError)。
| 函數 | 說明 |
|---|---|
os.getcwd() |
傳回目前的工作目錄(Current Working Directory) |
os.chdir(dirname) |
切換目錄到 dirname |
os.listdir(dirname) |
列出 dirname 裡的檔案與目錄名稱 |
os.mkdir(dirname)/os.rmdir(dirname) |
建立目錄/刪除空的目錄 |
os.rename(src, dst) |
將檔案或目錄 src 更名為 dst |
os.remove(filename) |
刪除檔案 |
os.path.exists()、isfile()、isdir() |
檢查路徑是否存在、是不是檔案、是不是目錄 |
os.path.getsize() |
檔案大小(位元組) |
os.path.basename()、splitext()、join() |
取出檔名、拆出副檔名、組合路徑 |
os.path.join('data', 'a.txt')會依作業系統使用正確的分隔字元(Windows 是\,其他是/),比自己用字串相加安全。
os.listdir():列出目錄內容
這是投影片的 listdir.py,引數是 .(目前目錄)。工作目錄裡預先放了三個檔案。os.listdir() 傳回的順序不一定固定,所以先用 sorted() 排序。
os.path:路徑與檔案檢查
os.path 的函數大多只處理字串(例如 splitext、basename),不會真的去碰檔案;exists、isfile、getsize 則會去檢查實際的檔案系統。
os.rename() 與 os.remove()
工作目錄裡有 draft.txt 和 temp.txt。播完後看「檔案」分頁:剩下哪個檔案、叫什麼名字?
想一想:os.path
下面的程式會印出什麼?
import os
print(os.path.splitext("photo.2026.jpg"))
下面的程式會印出什麼?
import os
print(os.path.basename("data/2026/score.csv"))
關於 os.listdir(".") 的傳回值,下面哪一個正確?
實作:列出所有 .txt 檔與大小
程式先建立了三個檔案。請用 os.listdir('.') 找出副檔名是 .txt 的檔案,排序後每個印一行「檔名 大小」,大小用 os.path.getsize() 取得。
重點精華回顧
- 標準函式庫隨 Python 一起安裝,
import就能用;True、False、None等內建常數與print()、len()等內建函數連 import 都不用。 sys.argv:命令列引數串列,sys.argv[0]是程式名稱,引數一律是字串。sys.path:模組搜尋路徑串列;sys.exit(結束碼)引發SystemExit結束程式,0 代表成功;sys.platform、sys.version是平台與版本資訊。os.getcwd()目前目錄、os.chdir()切換目錄、os.listdir()列出目錄內容、os.mkdir()/os.rmdir()建立與刪除空目錄。os.rename()更名、os.remove()刪除檔案;出錯時引發OSError。os.path處理路徑:exists、isfile、isdir、getsize、basename、splitext、join。