萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> 程式語言綜合

Python 文件與目錄操作完全指南:os 與 os.path 核心 API 實戰

核心模塊概覽

  • os:系統級操作(進程、環境變量、文件描述符)
  • os.path:路徑操作(拼接、分割、屬性查詢)
  • shutil:高級文件操作(複製、移動、壓縮)— 推薦優先使用
  • pathlib (Python 3.4+):面向對象路徑操作,現代首選

目錄操作實戰

獲取/切換當前工作目錄

import os
print(os.getcwd())        # 獲取當前目錄
os.chdir("/tmp")          # 切換目錄
print(os.getcwd())        # 驗證切換結果

列出目錄內容

def list_files(directory):
    """僅列出普通文件,排除子目錄"""
    for name in os.listdir(directory):
        path = os.path.join(directory, name)
        if os.path.isfile(path):
            print(path)

list_files("/root")

創建/刪除目錄

os.mkdir("new_dir")           # 創建單級目錄
os.makedirs("a/b/c", exist_ok=True)  # 遞歸創建,exist_ok 防報錯
os.rmdir("empty_dir")         # 刪除空目錄
shutil.rmtree("non_empty_dir") # 遞歸刪除非空目錄

文件屬性與時間戳

import os, time

path = "/etc/passwd"

# 時間戳獲取(返回浮點數秒數,自 1970-01-01)
atime = os.path.getatime(path)  # 最後訪問時間
mtime = os.path.getmtime(path)  # 最後修改時間
ctime = os.path.getctime(path)  # 創建時間 (Windows) / 元數據變更時間

# 格式化輸出
print(f"Last access: {time.ctime(atime)}")
print(f"Last modify: {time.ctime(mtime)}")

# 統一獲取:os.stat()
stat = os.stat(path)
print(f"Size: {stat.st_size} bytes")
print(f"Mode: {oct(stat.st_mode)}")
print(f"UID: {stat.st_uid}, GID: {stat.st_gid}")

路徑判斷與構建

# 判斷類型
os.path.isfile(path)    # 是否普通文件
os.path.isdir(path)     # 是否目錄
os.path.islink(path)    # 是否符號鏈接
os.path.exists(path)    # 是否存在
os.path.ismount(path)   # 是否掛載點

# 路徑拆分與拼接
dirname, basename = os.path.split("/etc/passwd")  # ("/etc", "passwd")
dirname = os.path.dirname(path)
basename = os.path.basename(path)
full = os.path.join("/etc", "passwd")             # 跨平台安全拼接
abs_path = os.path.abspath("relative/path")       # 轉絕對路徑
real_path = os.path.realpath("/link/to/file")     # 解析符號鏈接

文件讀寫最佳實踐

# 文本模式(推薦 with 語句自動關閉)
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()          # 全讀
    # lines = f.readlines()     # 按行讀列表
    # for line in f:            # 逐行迭代(記憶體友好)

with open("output.txt", "w", encoding="utf-8") as f:
    f.write("Hello\n")
    f.writelines(["Line1\n", "Line2\n"])

# 二進制模式
with open("image.png", "rb") as f:
    data = f.read()

現代化替代:pathlib (Python 3.4+)

from pathlib import Path

p = Path("/etc/passwd")
print(p.exists())
print(p.is_file())
print(p.stat().st_size)
print(p.read_text(encoding="utf-8"))
print(p.parent)        # 父目錄
print(p.name)          # 文件名
print(p.suffix)        # 擴展名
print(p.with_suffix(".bak"))  # 替換擴展名

# 遞歸遍歷
for py_file in Path(".").rglob("*.py"):
    print(py_file)

常見陷阱避坑

  • 路徑拼接:永遠用 os.path.join 或 Path /,不要手動拼接 "/" + name
  • 編碼指定:文本文件必須指定 encoding="utf-8",避免平台默認編碼差異
  • 大文件處理:逐行迭代或分塊讀取,避免 read() 爆內存
  • 異常處理:文件操作必須包裹 try/except OSError

熟練掌握 os/os.path/pathlib 三大工具集,能高效解決 99% 的文件系統操作需求。

copyright © 萬盛學電腦網 all rights reserved