Python 3.12:用 pathlib.Path.walk 简单扫目录

72 次浏览1 条回复

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。

这个 API 还有个细节挺容易漏:默认不跟随目录软链接。真要跟的话可以传 follow_symlinks=True,但扫用户目录时最好小心一点,避免链接绕回上层导致重复遍历。

另外如果只是过滤目录,像示例里直接改 dirnames 是对的;改 filenames 就只影响自己后面的循环,不会改变遍历行为。