本文介绍如何使用正则表达式精准识别并批量删除当前目录下文件名仅由数字组成、且无任何扩展名的临时文件,适用于数据库文档缓存等场景。
本文介绍如何使用正则表达式精准识别并批量删除当前目录下文件名仅由数字组成、且无任何扩展名的临时文件,适用于数据库文档缓存等场景。
在基于文件ID缓存二进制文档(如从MySQL BLOB 字段写入磁盘)的桌面应用中,常采用纯数字作为文件名(例如 12345、999),不带扩展名以规避类型误判或权限问题。但程序退出时需自动清理这些临时文件,否则将导致磁盘占用持续增长。关键挑战在于:准确区分“纯数字文件名”与普通文件(如 123.txt、config2024 或 data.json),避免误删。
推荐使用 pathlib 结合正则表达式实现健壮、可读性强的清理逻辑:
import re
from pathlib import Path
def cleanup_numeric_files(directory: Path = None) -> int:
"""
删除指定目录下所有文件名仅由数字组成(无扩展名)的文件。
返回成功删除的文件数量。
"""
if directory is None:
directory = Path.cwd()
# 编译正则:匹配完整文件名(不含路径和扩展名),仅含一个或多个数字
numeric_name_pattern = re.compile(r'^\d+$')
deleted_count = 0
for item in directory.iterdir():
# 确保是文件(非目录),且无后缀(suffix为空字符串)
if item.is_file() and not item.suffix:
# 提取纯文件名(不含路径),检查是否全为数字
if numeric_name_pattern.match(item.stem):
try:
item.unlink() # 安全删除
deleted_count += 1
print(f"✓ 已删除: {item.name}")
except PermissionError:
print(f"⚠ 权限不足,跳过: {item.name}")
except OSError as e:
print(f"⚠ 删除失败 {item.name}: {e}")
return deleted_count
# 使用示例:程序退出前调用
if __name__ == "__main__":
total = cleanup_numeric_files()
print(f"\n✅ 清理完成:共删除 {total} 个纯数字临时文件")✅ 关键设计说明:
- item.suffix == '' 严格排除所有带扩展名的文件(如 123.pdf → suffix == '.pdf',被过滤);
- item.stem 获取无扩展名的主文件名,再用 ^\d+$ 验证是否完全由数字构成(^ 和 $ 锚定首尾,防止 a123 或 123b 被误匹配);
- 使用 try/except 捕获常见异常,保障批量操作的鲁棒性;
- 支持自定义目录路径,便于测试与集成(如指向 Path('/tmp/doc_cache'))。
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 生产环境建议先启用日志记录(而非仅 print),并增加 dry-run 模式(添加 dry_run=True 参数预览待删文件);
- 若文件正在被其他进程占用(如 subprocess.run(['open', ...]) 打开的文档尚未关闭),unlink() 会抛出 PermissionError,本方案已妥善处理;
- 避免使用 os.listdir() + os.remove() 组合——pathlib 更现代、跨平台且语义清晰。
通过该方法,您可在应用优雅退出时(例如注册 atexit 钩子或 try/finally 块中)一键清理所有 ID 缓存文件,兼顾安全性、可维护性与执行效率。










