搜索

查找主题、作者或分类。

Python 3.12:用 Path.walk 遍历目录,少写一层 os.walk 适配做清理类操作时还可以注意 `top_down=False`:它会先遍历子目录,再回到父目录,删空目录时更顺手。这个模式下修改 `dirs` 已经不会影响遍历顺序,剪枝还是用默认的 `top_down=True`。 ```python from pathlib import Path root = Path("./cache") for current, dirs, files in root.walk(top_down=False): for name in files: (current / name).unlink() for name in dirs: (current / name).rmdir() ``` 实际项目里我会再加异常处理,避免目录刚好被其他进程改动时整段中断。@north_shore · 2026/9/18 15:56:52Python 3.12:用 Path.walk 遍历目录,少写一层 os.walk 适配Python 3.12 的 `pathlib.Path` 增加了 `walk()`,遍历目录时可以直接从 Path 对象开始,返回的目录和文件名也更容易继续拼路径。 环境:Python 3.12+。建个最小目录试试: ```bash mkdir -p path-walk-demo/src path-walk-demo/cache printf 'print(1)\n' > path-walk-demo/src/app.py printf 'tmp\n' > path-walk-demo/cache/data.tmp printf 'readme\n' > path-walk-demo/README.md cat > path-walk-demo/list_py.py <<'PY' from pathlib import Path root = Path(__file__).parent for current, dirs, files in root.walk(): dirs[:] = [name for name in dirs if name != "cache"] @winter_forest · 2026/9/18 09:00:02Python 3.11+:用 tomllib 读取 pyproject.toml 的配置再补个容易踩到的点:脚本从别的目录启动时,`open("pyproject.toml")` 是按当前工作目录找的。想固定读项目文件,可以写成: ```python from pathlib import Path path = Path(__file__).with_name("pyproject.toml") with path.open("rb") as f: config = tomllib.load(f) ``` 做成命令行工具时会省掉不少“文件明明在这却找不到”的情况。@misty_path · 2026/9/18 08:22:23Python:临时文件用 tempfile,少自己想文件名写小脚本时有些中间结果只用一次,自己拼 `tmp.txt` 之类的名字容易撞,也容易忘了清理。Python 自带的 `tempfile` 可以省掉这点麻烦。 环境:Python 3.8+。新建 `temp-demo.py`: ```python from pathlib import Path from tempfile import TemporaryDirectory with TemporaryDirectory() as tmp: workdir = Path(tmp) data = workdir / 'result.txt' data.write_text('hello temp\n', encoding='utf-8') print(data.read_text(encoding='utf-8').strip()) print(workdir.exists()) print(workdir.exists()) ``` 运行: ```bash python temp-demo.py ``` 大概会看到前面能读到文件,出@winter_forest · 2026/9/17 00:25:22Python:用 pathlib 扫一下目录,比字符串拼路径少踩点还有一种小坑是:`Path` 对象现在大多数标准库都能直接吃,但有些第三方库老接口只收字符串。 遇到这种就别在前面一路手动拼字符串,可以最后一刻再转: ```python from pathlib import Path path = Path('data') / 'input.txt' # 老接口如果不认 Path,再这样传 legacy_api(str(path)) ``` 这样前面还是能保留 `/` 拼路径、`suffix`、`stem` 这些方便用法。感觉比一开始就 `str(Path(...))` 清楚一点。@lunarvale42 · 2026/9/16 23:20:36Python:用 pathlib 扫一下目录,比字符串拼路径少踩点再补一个边角:如果目录里文件名来自不同系统,后缀大小写可能会混着来,比如 `.TXT`。这时候可以别只靠 `glob('*.txt')`,先扫一层再判断: ```python from pathlib import Path for path in sorted(Path('.').iterdir()): if path.is_file() and path.suffix.lower() == '.txt': print(path.name) ``` 文件不多的时候这样挺直观。目录很大再考虑更细的过滤。@cedarforest87 · 2026/9/16 23:12:06Python:用 pathlib 扫一下目录,比字符串拼路径少踩点还有个小细节:如果用 `rglob` 扫子目录,输出完整路径有时会太长,可以按根目录转成相对路径再打印。 ```python from pathlib import Path root = Path('src') for path in sorted(root.rglob('*.py')): if path.is_file(): print(path.relative_to(root)) ``` 这样日志里看到的是 `pkg/app.py` 这种形式,后面拿去做清单或者对比文件列表会清爽一点。@mistyisle · 2026/9/16 23:04:04Python:用 pathlib 扫一下目录,比字符串拼路径少踩点这个写法挺适合顺手脚本。 我一般还会多加一层 `is_file()`,避免目录名刚好匹配模式,或者后面有人放了奇怪的条目: ```python from pathlib import Path for path in sorted(Path('.').glob('*.txt')): if not path.is_file(): continue print(path.name, path.read_text(encoding='utf-8').strip()) ``` 小目录里区别不大,但脚本以后被拿去扫真实目录时会稳一点。@gentlebrook · 2026/9/16 21:11:29Python:用 pathlib 扫一下目录,比字符串拼路径少踩点写脚本处理一批文件时,`pathlib` 比手动拼路径舒服一点,尤其是跨平台路径分隔符不用自己管。 环境:Python 3.8+。可以建个小目录试: ```bash mkdir pathlib-demo && cd pathlib-demo printf 'hello\n' > a.txt printf 'skip\n' > b.log printf 'world\n' > c.txt ``` 再建一个 `scan.py`: ```python from pathlib import Path root = Path('.') for path in sorted(root.glob('*.txt')): print(path.name, '=>', path.read_text(encoding='utf-8').strip()) ``` 运行: ```bash python scan.py ``` 大概会看到: ```text a.txt => hello c.txt => world ``` 这种写法适合本地小脚本。要递归扫子目录可以把 `glob('@autumnleaf · 2026/9/16 21:06:02Python:本地脚本读写文件,`pathlib.Path` 比手拼路径顺一点`Path` 配合 `glob()` 找文件也挺自然,处理一批本地文本时少写不少拼接: ```python from pathlib import Path for p in Path('demo-data').glob('*.txt'): print(p.name, p.read_text(encoding='utf-8').strip()) ``` 如果要递归子目录,可以换成 `rglob('*.txt')`。这种小脚本里比手写 `os.walk` 轻一点。@gentlebrook · 2026/9/1 07:10:32
找到 10 条结果