Python过期文件夹删除脚本:校验文件夹名前缀日期一致性
问题背景
现有Python脚本用于递归扫描指定路径,删除命名中带-、且日期早于4周前的文件夹。脚本通过拆分文件夹名第一个-前的8位字符串解析日期,示例文件夹名格式为20220317-120259_.page_w_200-1.png。
当前datetime.strptime默认会解析所有格式匹配的日期,无法过滤业务层面的异常日期,比如:
- 10000101(公元1000年,远早于业务实际产生文件的时间)
- 28070405(公元2807年,远晚于当前时间)
原有脚本代码如下:
from pathlib import Path from shutil import rmtree import datetime from datetime import datetime, timezone, timedelta EXPIRATION_WEEKS=4 def delete_folder(folder: Path): """ Delete the content folder. """ rmtree(folder) def check_expiration_date(folder: Path): expiration_date = datetime.now(timezone.utc) - timedelta(weeks=EXPIRATION_WEEKS) folder_date = folder.name.split('-')[0] folder_date = datetime.strptime(folder_date, '%Y%m%d') return True if folder_date.date() < expiration_date.date() else False def check_content_folder(folder: Path): """ Check if the content folder has a concrete character """ return True if '-' in folder.name else False def delete_folders_with_expired_date(data_path: Path): """ Delete the content folder. """ for folder in data_path.glob('*'): if folder.is_dir(): if check_content_folder(folder): if check_expiration_date(folder): delete_folder(folder) print(f"Deleted folder: {folder}") else: delete_folders_with_expired_date(folder)
解决方案
不需要引入第三方依赖,直接新增业务层面的日期范围校验即可,同时补充基础格式校验避免脚本报错:
- 定义合理的合法日期区间:下限设置为业务正式上线的日期(可自行调整,示例用2000年1月1日),上限设置为当前日期(正常场景不会生成未来日期命名的文件夹)
- 解析日期前先判断字符串是否为8位纯数字,避免格式错误触发异常
- 解析出日期后先判断是否在合法区间内,异常日期直接跳过不做删除处理
修改后的完整代码:
from pathlib import Path from shutil import rmtree import datetime from datetime import datetime, timezone, timedelta EXPIRATION_WEEKS=4 # 可根据自身业务场景调整合法日期下限 VALID_DATE_LOWER_BOUND = datetime(2000, 1, 1).date() VALID_DATE_UPPER_BOUND = datetime.now(timezone.utc).date() def delete_folder(folder: Path): """ Delete the content folder. """ rmtree(folder) def is_valid_business_date(date_str: str) -> bool: """校验日期字符串是否为业务层面的合法日期""" # 基础格式校验:必须是8位纯数字 if len(date_str) != 8 or not date_str.isdigit(): return False # 格式解析校验 try: parsed_date = datetime.strptime(date_str, '%Y%m%d').date() except ValueError: return False # 业务范围校验 return VALID_DATE_LOWER_BOUND <= parsed_date <= VALID_DATE_UPPER_BOUND def check_expiration_date(folder: Path): expiration_date = datetime.now(timezone.utc) - timedelta(weeks=EXPIRATION_WEEKS) folder_date_str = folder.name.split('-')[0] # 日期不合法直接返回False,不执行删除 if not is_valid_business_date(folder_date_str): print(f"Skip folder with invalid date: {folder}") return False folder_date = datetime.strptime(folder_date_str, '%Y%m%d') return folder_date.date() < expiration_date.date() def check_content_folder(folder: Path): """ Check if the content folder has a concrete character """ return '-' in folder.name def delete_folders_with_expired_date(data_path: Path): """ Delete the content folder. """ for folder in data_path.glob('*'): if folder.is_dir(): if check_content_folder(folder): if check_expiration_date(folder): delete_folder(folder) print(f"Deleted folder: {folder}") else: delete_folders_with_expired_date(folder)
修改后,10000101这类过早日期、28070405这类未来日期,以及非8位纯数字的假日期都会被拦截,不会进入过期判断逻辑,避免误删。
内容的提问来源于stack exchange,提问作者Tau n Ro
相关产品推荐
相关产品推荐

