本文介绍如何使用正则表达式精准识别并批量删除当前目录下所有仅由数字组成、且无文件扩展名的临时文件,适用于数据库文档导出类应用的资源清理场景。
本文介绍如何使用正则表达式精准识别并批量删除当前目录下所有仅由数字组成、且无文件扩展名的临时文件,适用于数据库文档导出类应用的资源清理场景。
在基于 MySQL 存储二进制文档(如 DOC_COPY 字段)并按 DOC_ID 动态生成无扩展名临时文件(例如 12345、67890)的桌面应用中,程序退出前需自动清理这些残留文件,避免磁盘占用累积。关键挑战在于:准确区分目标文件与普通数字命名文件(如 123.txt 或 config2024),确保只删除“纯数字 + 无扩展名”的合法临时文件。
✅ 正确匹配逻辑说明
- ✅ 匹配:123、0、999999
- ❌ 不匹配:123.txt、abc123、123.json、.123、123(含空格)
因此,正则表达式必须同时满足:
- 字符串从头到尾(^...$)完全由数字构成;
- 文件路径需通过 pathlib.Path 获取其纯文件名(不含后缀),再进行匹配。
? 推荐实现代码(含异常防护与日志)
import re
from pathlib import Path
def cleanup_numeric_files(directory: Path = None) -> int:
"""
删除指定目录下所有纯数字命名、无扩展名的文件。
返回实际删除的文件数量。
"""
if directory is None:
directory = Path.cwd()
# 编译正则提升性能(尤其在大量文件时)
numeric_pattern = re.compile(r'^\d+$')
deleted_count = 0
for file_path in directory.iterdir():
if file_path.is_file() and not file_path.suffix: # 确保是文件且无扩展名
if numeric_pattern.match(file_path.stem): # 仅匹配文件名主体(不含后缀)
try:
file_path.unlink()
print(f"✅ 已删除临时文件: {file_path.name}")
deleted_count += 1
except PermissionError:
print(f"⚠️ 权限不足,跳过: {file_path.name}")
except OSError as e:
print(f"❌ 删除失败 {file_path.name}: {e}")
print(f"? 清理完成:共删除 {deleted_count} 个纯数字临时文件")
return deleted_count
# 使用示例(建议在程序退出前调用)
if __name__ == "__main__":
cleanup_numeric_files()⚠️ 重要注意事项
- 不要使用 os.listdir() + str.endswith():易误删 12345.bak 或漏判隐藏文件;pathlib 更语义清晰、跨平台健壮。
- 务必检查 file_path.suffix == '':这是判断“无扩展名”的唯一可靠方式(file_path.name 可能含点,但不表示扩展名)。
- 避免 file_path.name.isdigit() 的陷阱:该方法对 '0123'(带前导零)有效,但无法排除 '12.3'(虽含点但 isdigit() 返回 False),而正则 r'^\d+$' 更严谨。
- 生产环境建议增加白名单/日志审计:例如记录被删文件的 stat().st_mtime,便于追溯;或先移动至 ./_trash/ 再异步清理。
- PyInstaller 打包注意:确保运行时工作目录(Path.cwd())是你期望清理的目标路径;若需固定路径,改用绝对路径(如 Path(__file__).parent / "temp_docs")。
✅ 总结
通过 pathlib.Path 结合 re.compile(r'^\d+$') 对 stem 进行匹配,可精准、高效、安全地识别并清理纯数字无扩展名临时文件。该方案简洁可靠,已验证兼容 Windows/macOS/Linux,适合作为 PyInstaller 打包应用的 atexit 清理钩子或主程序退出流程的一部分。










