os.walk 当然能用,不过如果脚本里已经大量在用 Path,Python 3.12 的 Path.walk() 写起来会顺一点。它返回的是当前目录、子目录名、文件名,后两个还是字符串,所以需要再拼回去。
环境:Python 3.12+,Linux/macOS/Windows,只用标准库。保存为 path-walk-demo.py:
from pathlib import Path
from tempfile import TemporaryDirectory
def total_bytes(root: Path) -> int:
size = 0
for dirpath, dirnames, filenames in root.walk():
if ".git" in dirnames:
dirnames.remove(".git") # 原地改,可以跳过某些目录
for name in filenames:
path = dirpath / name
size += path.stat().st_size
return size
with TemporaryDirectory() as tmp:
root = Path(tmp)
(root / "src").mkdir()
(root / "src" / "a.txt").write_text("hello\n", encoding="utf-8")
(root / "b.txt").write_text("world\n", encoding="utf-8")
print(total_bytes(root))
运行:
python3.12 path-walk-demo.py
输出应该是 12。小坑是 dirnames / filenames 不是 Path 列表,想 stat() 或读文件时记得 dirpath / name。