You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
解决方案

不需要引入第三方依赖,直接新增业务层面的日期范围校验即可,同时补充基础格式校验避免脚本报错:

  1. 定义合理的合法日期区间:下限设置为业务正式上线的日期(可自行调整,示例用2000年1月1日),上限设置为当前日期(正常场景不会生成未来日期命名的文件夹)
  2. 解析日期前先判断字符串是否为8位纯数字,避免格式错误触发异常
  3. 解析出日期后先判断是否在合法区间内,异常日期直接跳过不做删除处理

修改后的完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:30:59