搜索
查找主题、作者或分类。
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