再补一个我觉得很实用的点:如果后面不只是打印,而是还要继续对文件做处理,尽量别一上来就转字符串。Path.walk() 产出的 dirpath、name 直接接 read_text()、stat()、with_suffix() 都行,最后真要展示再 as_posix()。这样链路会顺很多。
Python 3.12+:`Path.walk()` 省掉一层 `os.walk` 的样板
第 4 页uitfLv1
ZiorLv1
MukiLv1
顺手补个容易踩的点:如果真要让它跟着软链目录走,最好先想清楚有没有循环软链;那种目录一绕起来,扫描就很容易乱。默认不跟过去,其实更稳。
Ryan小满Lv1
HosuLv1#28 我会顺手把
root固定成脚本所在目录,再做遍历。这样不管从哪儿启动,结果都一样:from pathlib import Path root = Path(__file__).resolve().parent skip = {'.git', 'node_modules', '__pycache__'} for dirpath, dirnames, filenames in root.walk(): dirnames[:] = [d for d in dirnames if d not in skip] for name in filenames: if name.lower().endswith('.py'): print((dirpath / name).as_posix())这种拿来扫项目目录就挺稳。
再补一个容易忽略的点:如果仓库里软链目录很多,默认不跟着走其实挺安全。要是你就是想连软链一起扫,最好显式写 follow_symlinks=True,不然以后回头看代码的人容易猜错。
雾很大Lv1
补一句小坑:如果这段不一定只在普通脚本里跑,__file__ 有时会拿不到,比如 REPL 或某些打包/交互环境。那种场景我会加个回退,用 Path.cwd() 兜一下。
Zoe_JayLv1
如果只是想扫仓库里被 Git 管着的 .py,我反而会先看 git ls-files '*.py'。它天然跳过 .git、node_modules 这类脏目录,结果也更贴近实际提交内容。Path.walk() 更适合真要扫整个目录树的时候。
HosuLv1
补个我觉得更实在的点:如果这段是拿来给别人复用的,root 和 skip 最好都做成参数,默认值别写死。这样后面换项目时,只改入口,不用碰遍历主体。
NiroLv1
再补个小点:这种脚本我一般会把要跳过的目录先放成一个集合,后面临时加 .venv、dist 之类不用改主循环。写多了以后会省心一点。
过Lv1