人工智能之編程進階 Python高級
第三章 系統類模塊
(文章目錄)
前言
本章節之後會講述一些創建的標準庫使用方式,本文主要介紹兩種模塊os以及sys模塊
os模塊
os 模塊是 Python 標準庫中用於與操作系統交互的核心模塊,提供了訪問文件系統、環境變量、進程管理、路徑操作等功能。它是編寫跨平台(Windows、macOS、Linux)腳本的重要工具。
一、導入方式
import os
⚠️ 注意:
os模塊本身不處理路徑拼接的跨平台問題(如/vs\),推薦配合os.path或更現代的pathlib使用。
二、常用功能分類
1. 路徑操作(os.path 子模塊)
雖然 os.path 是獨立子模塊,但通常與 os 一起使用。
import os
# 獲取當前工作目錄
cwd = os.getcwd()
print("當前目錄:", cwd)
# 改變工作目錄
os.chdir("/tmp")
# 路徑拼接(自動處理斜槓)
path = os.path.join("folder", "subfolder", "file.txt")
print(path) # folder/subfolder/file.txt (Linux/macOS) 或 folder\subfolder\file.txt (Windows)
# 路徑解析
full_path = "/home/user/docs/report.pdf"
print(os.path.basename(full_path)) # "report.pdf"
print(os.path.dirname(full_path)) # "/home/user/docs"
print(os.path.split(full_path)) # ("/home/user/docs", "report.pdf")
# 檢查路徑是否存在
if os.path.exists("/etc/passwd"):
print("文件存在")
# 檢查類型
print(os.path.isfile("test.txt")) # 是否是文件
print(os.path.isdir("my_folder")) # 是否是目錄
print(os.path.islink("symlink")) # 是否是符號鏈接
# 獲取絕對路徑
abs_path = os.path.abspath("relative/path")
print(abs_path)
# 規範化路徑(處理 . 和 ..)
norm = os.path.normpath("/a/b/../c/./d")
print(norm) # /a/c/d
✅ 替代方案:Python 3.4+ 推薦使用
pathlib.Path(更面向對象、更簡潔):from pathlib import Path p = Path("folder") / "subfolder" / "file.txt"
2. 文件和目錄操作
創建與刪除
# 創建單層目錄
os.mkdir("new_folder")
# 創建多層目錄(類似 mkdir -p)
os.makedirs("parent/child/grandchild", exist_ok=True)
# 刪除文件
os.remove("old_file.txt")
# 刪除空目錄
os.rmdir("empty_folder")
# 刪除非空目錄(需用 shutil)
import shutil
shutil.rmtree("non_empty_folder")
列出目錄內容
# 列出目錄下所有文件和子目錄名
files = os.listdir("/home/user")
print(files)
# 遍歷目錄樹(生成器,節省內存)
for root, dirs, files in os.walk("/home/user"):
print(f"當前目錄: {root}")
print(f"子目錄: {dirs}")
print(f"文件: {files}")
print("-" * 30)
文件信息(元數據)
stat_info = os.stat("example.txt")
print(f"大小: {stat_info.st_size} 字節")
print(f"修改時間: {stat_info.st_mtime}") # 時間戳
# 更友好的時間格式
import time
mtime = time.ctime(stat_info.st_mtime)
print("修改時間:", mtime)
3. 環境變量
# 獲取環境變量
home = os.environ.get("HOME") # 安全獲取(不存在返回 None)
user = os.getenv("USER", "default_user") # 可設默認值
# 設置環境變量(僅當前進程有效)
os.environ["MY_VAR"] = "my_value"
# 刪除環境變量
if "MY_VAR" in os.environ:
del os.environ["MY_VAR"]
4. 進程與系統信息
# 獲取進程 ID
pid = os.getpid()
print("當前進程ID:", pid)
# 獲取父進程 ID
ppid = os.getppid()
print("父進程ID:", ppid)
# 執行系統命令(不推薦,有安全風險)
os.system("ls -l") # 返回退出狀態碼
# 獲取系統名稱
print(os.name) # 'posix' (Linux/macOS), 'nt' (Windows)
# 獲取登錄用户名
try:
print(os.getlogin())
except OSError:
import getpass
print(getpass.getuser()) # 更可靠
🔒 安全提示:避免使用
os.system()執行用户輸入的命令,推薦用subprocess模塊。
5. 權限與所有權(Unix/Linux/macOS)
# 修改文件權限(八進制)
os.chmod("script.sh", 0o755) # rwxr-xr-x
# 修改文件所有者(需 root 權限)
# os.chown("file.txt", uid, gid)
三、跨平台注意事項
| 功能 | Windows | Unix-like (Linux/macOS) |
|---|---|---|
| 路徑分隔符 | \ |
/ |
| 行結束符 | \r\n |
\n |
| 環境變量 | os.environ['USERNAME'] |
os.environ['USER'] |
| 可執行文件擴展名 | .exe |
無 |
✅ 解決方案:
- 使用
os.path.join()拼接路徑 - 使用
os.linesep獲取當前系統換行符 - 使用
os.sep獲取路徑分隔符(但通常不需要)
# 跨平台路徑示例
config_path = os.path.join(os.path.expanduser("~"), ".myapp", "config.ini")
四、常用實用函數
# 展開 ~ 為用户主目錄
home_config = os.path.expanduser("~/.bashrc")
# 獲取臨時目錄
tmp_dir = os.environ.get("TMPDIR", "/tmp") # Unix
# 或使用 tempfile 模塊更安全
# 生成隨機字節(用於臨時文件名等)
random_bytes = os.urandom(16) # 16字節隨機數據
五、與 pathlib 對比(Python 3.4+)
| 操作 | os.path |
pathlib |
|---|---|---|
| 路徑拼接 | os.path.join("a", "b") |
Path("a") / "b" |
| 讀取文件 | open(path).read() |
Path(path).read_text() |
| 檢查存在 | os.path.exists(p) |
Path(p).exists() |
| 遍歷目錄 | os.walk() |
Path(p).rglob("*.py") |
✅ 建議:新項目優先使用 pathlib,舊代碼或簡單腳本可用 os.path。
六、典型應用場景
1. 批量重命名文件
import os
folder = "photos"
for i, filename in enumerate(os.listdir(folder)):
if filename.endswith(".jpg"):
old_path = os.path.join(folder, filename)
new_path = os.path.join(folder, f"photo_{i:03d}.jpg")
os.rename(old_path, new_path)
2. 查找大文件
def find_large_files(directory, min_size_mb=100):
min_size = min_size_mb * 1024 * 1024
for root, _, files in os.walk(directory):
for file in files:
path = os.path.join(root, file)
try:
if os.path.getsize(path) > min_size:
print(f"{path} ({os.path.getsize(path) / 1024 / 1024:.1f} MB)")
except OSError:
pass # 跳過無法訪問的文件
find_large_files("/home/user", 50)
3. 創建項目目錄結構
def create_project_structure(project_name):
dirs = [
f"{project_name}/src",
f"{project_name}/tests",
f"{project_name}/docs"
]
for d in dirs:
os.makedirs(d, exist_ok=True)
# 創建初始化文件
with open(f"{project_name}/src/__init__.py", "w") as f:
pass
create_project_structure("my_project")
七、注意事項與最佳實踐
✅ 推薦做法
- 使用
os.path.join()拼接路徑,避免硬編碼/或\ - 檢查文件是否存在再操作(但注意競態條件)
- 使用
exist_ok=True避免FileExistsError - **優先使用
pathlib**(Python 3.4+) - 不要用
os.system()執行外部命令,改用subprocess
❌ 避免的做法
# 錯誤:硬編碼路徑分隔符
path = "folder\\subfolder\\file.txt" # Windows only
# 正確
path = os.path.join("folder", "subfolder", "file.txt")
# 錯誤:直接拼接字符串
path = user_input + "/config.txt" # 可能導致路徑遍歷錯誤
# 正確:使用 os.path.join 並驗證路徑
base = "/safe/base/dir"
path = os.path.join(base, user_input)
if not path.startswith(base):
raise ValueError("Invalid path")
八、總結
| 功能類別 | 常用函數/屬性 |
|---|---|
| 路徑操作 | os.path.join,os.path.exists,os.path.isfile |
| 目錄操作 | os.listdir,os.walk,os.makedirs |
| 文件操作 | os.remove,os.rename,os.stat |
| 環境變量 | os.environ,os.getenv |
| 進程信息 | os.getpid,os.getppid |
| 系統信息 | os.name,os.uname()(Unix) |
🔑 核心思想:
os模塊讓你用統一的 Python 接口操作不同操作系統的底層功能,實現跨平台兼容性。
sys模塊
sys 模塊是 Python 標準庫中用於與 Python 解釋器及其運行環境交互的核心模塊。它提供了訪問命令行參數、退出程序、獲取 Python 版本、操作模塊搜索路徑等功能,常用於腳本控制、調試和系統級編程。
一、導入方式
import sys
二、常用功能詳解
1. 命令行參數(sys.argv)
獲取傳遞給 Python 腳本的命令行參數。
# script.py
import sys
print("腳本名:", sys.argv[0])
print("參數個數:", len(sys.argv) - 1)
print("所有參數:", sys.argv[1:])
# 運行:python script.py hello 123 --verbose
# 輸出:
# 腳本名: script.py
# 參數個數: 3
# 所有參數: ['hello', '123', '--verbose']
✅ 用途:編寫 CLI 工具、批處理腳本。
2. 退出程序(sys.exit())
優雅地終止程序,可指定退出狀態碼。
import sys
if not user_authenticated:
print("認證失敗!", file=sys.stderr)
sys.exit(1) # 非0表示錯誤
print("程序正常運行...")
sys.exit(0) # 0 表示成功(可省略)
sys.exit()本質是拋出SystemExit異常,可被捕獲(但通常不建議)。- 狀態碼:
0:成功- 非
0:錯誤(如1,2等)
3. 標準輸入/輸出/錯誤流(sys.stdin, sys.stdout, sys.stderr)
重定向或操作標準流。
import sys
# 讀取所有標準輸入(類似 cat)
# data = sys.stdin.read()
# 寫入標準輸出
sys.stdout.write("Hello, stdout!\n")
# 寫入標準錯誤(用於錯誤信息)
sys.stderr.write("Error: something went wrong!\n")
# 重定向輸出到文件
with open("output.log", "w") as f:
sys.stdout = f
print("這條信息會寫入文件")
sys.stdout = sys.__stdout__ # 恢復原始 stdout
💡
print()默認輸出到sys.stdout,錯誤信息應輸出到sys.stderr。
4. Python 解釋器信息
import sys
print("Python 版本:", sys.version) # 詳細版本字符串
print("Python 版本信息:", sys.version_info) # 命名元組 (major=3, minor=10, ...)
print("平台:", sys.platform) # 'linux', 'win32', 'darwin' (macOS)
print("可執行文件路徑:", sys.executable) # Python 解釋器路徑
print("模塊搜索路徑:", sys.path) # 列表,解釋器查找模塊的位置
✅ 用途:條件兼容不同平台或版本。
if sys.version_info < (3, 8):
raise RuntimeError("需要 Python 3.8+")
5. 模塊與導入系統
sys.modules
已加載的模塊字典(緩存),可用於檢查或強制重載。
import json
print('json' in sys.modules) # True
# 強制重載模塊(調試時用)
import importlib
importlib.reload(json)
sys.path
Python 查找模塊的路徑列表,可動態修改。
# 添加自定義模塊路徑
sys.path.insert(0, "/my/custom/modules")
# 現在可以導入該路徑下的模塊
import my_module
⚠️ 修改
sys.path會影響整個解釋器會話。
6. 遞歸限制(sys.getrecursionlimit(), sys.setrecursionlimit())
防止無限遞歸導致棧溢出。
import sys
print("默認遞歸限制:", sys.getrecursionlimit()) # 通常 1000
# 增加限制(謹慎使用!)
sys.setrecursionlimit(2000)
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
print(factorial(500)) # 可能需要更高遞歸限制
❗ 過高的遞歸限制可能導致程序崩潰。
7. 強制刷新輸出緩衝(sys.stdout.flush())
確保輸出立即顯示(尤其在循環或長時間運行任務中)。
import sys
import time
for i in range(5):
sys.stdout.write(f"\r進度: {i+1}/5")
sys.stdout.flush() # 立即輸出
time.sleep(1)
print("\n完成!")
💡 在 Jupyter 或 IDE 中可能自動刷新,但在終端腳本中常需手動刷新。
8. 獲取對象引用計數(sys.getrefcount())
用於調試內存管理(CPython 特有)。
import sys
a = []
print(sys.getrefcount(a)) # 至少為 2(a 和 getrefcount 的參數)
🔍 一般開發者很少使用,主要用於底層調試。
三、典型應用場景
1. 編寫命令行工具
import sys
def main():
if len(sys.argv) != 2:
print("用法: python tool.py <filename>", file=sys.stderr)
sys.exit(1)
filename = sys.argv[1]
try:
with open(filename) as f:
print(f.read())
except FileNotFoundError:
print(f"錯誤: 文件 {filename} 不存在", file=sys.stderr)
sys.exit(2)
if __name__ == "__main__":
main()
2. 捕獲未處理異常(用於日誌記錄)
import sys
import traceback
def handle_exception(exc_type, exc_value, exc_traceback):
if issubclass(exc_type, KeyboardInterrupt):
sys.__excepthook__(exc_type, exc_value, exc_traceback)
return
print("程序崩潰!詳細信息已記錄到 error.log", file=sys.stderr)
with open("error.log", "w") as f:
traceback.print_exception(exc_type, exc_value, exc_traceback, file=f)
sys.excepthook = handle_exception
3. 動態調整輸出編碼(解決中文亂碼)
import sys
import io
# 強制 stdout 使用 UTF-8(Windows 常見問題)
if sys.stdout.encoding != 'utf-8':
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
四、sys vs os 模塊對比
| 功能 | sys 模塊 |
os 模塊 |
|---|---|---|
| 作用對象 | Python 解釋器本身 | 操作系統 |
| 命令行參數 | ✅sys.argv |
❌ |
| 退出程序 | ✅sys.exit() |
❌(但 os._exit() 可強制退出) |
| 環境變量 | ❌ | ✅os.environ |
| 文件/目錄操作 | ❌ | ✅os.remove,os.listdir |
| 標準流 | ✅sys.stdin/stdout/stderr |
❌ |
| Python 版本 | ✅sys.version |
❌ |
💡 兩者常配合使用:
import sys, os if sys.platform == "win32": os.system("cls") else: os.system("clear")
五、注意事項與最佳實踐
✅ 推薦做法
- **用
sys.exit()代替exit()**(後者是內置函數,僅適用於交互式環境) - 錯誤信息輸出到
sys.stderr - 檢查
sys.argv長度避免 IndexError - 用
sys.version_info做版本判斷(而非字符串比較)
❌ 避免的做法
# 不推薦:使用內置 exit()
exit(1)
# 推薦
sys.exit(1)
# 不安全:直接修改 sys.modules
sys.modules['json'] = None # 可能導致程序崩潰
# 不可靠:依賴 sys.path 順序
# 應使用虛擬環境或明確安裝路徑
六、總結:sys 模塊核心屬性/函數速查
| 功能 | 用法 |
|---|---|
| 命令行參數 | sys.argv |
| 退出程序 | sys.exit([code]) |
| 標準輸入 | sys.stdin |
| 標準輸出 | sys.stdout |
| 標準錯誤 | sys.stderr |
| Python 版本 | sys.version,sys.version_info |
| 操作系統平台 | sys.platform |
| 模塊搜索路徑 | sys.path |
| 已加載模塊 | sys.modules |
| 遞歸限制 | sys.getrecursionlimit(),sys.setrecursionlimit() |
| 刷新輸出 | sys.stdout.flush() |
總結
本文主要介紹兩種常見的模塊的實際應用,方便在不同情況下的操作,歡迎一起來學習,當前我們處於python語言的應用級別,並未涉及到算法庫,先掌握基本的語言應用,再繼續學習後續人工智能的相關領域的實踐。
資料關注
相關資料獲取: 公眾號:咚咚王
《Python編程:從入門到實踐》 《利用Python進行數據分析》 《算法導論中文第三版》 《概率論與數理統計(第四版) (盛驟) 》 《程序員的數學》 《線性代數應該這樣學第3版》 《微積分和數學分析引論》 《(西瓜書)周志華-機器學習》 《TensorFlow機器學習實戰指南》 《Sklearn與TensorFlow機器學習實用指南》 《模式識別(第四版)》 《深度學習 deep learning》伊恩·古德費洛著 花書 《Python深度學習第二版(中文版)【純文本】 (登封大數據 (Francois Choliet)) (Z-Library)》 《深入淺出神經網絡與深度學習+(邁克爾·尼爾森(Michael+Nielsen) 》 《自然語言處理綜論 第2版》 《Natural-Language-Processing-with-PyTorch》 《計算機視覺-算法與應用(中文版)》 《Learning OpenCV 4》 《AIGC:智能創作時代》杜雨+&+張孜銘 《AIGC原理與實踐:零基礎學大語言模型、擴散模型和多模態模型》 《從零構建大語言模型(中文版)》 《實戰AI大模型》 《AI 3.0》