Python批量清理文件夹历史文件(Windows)

背景

开发调试过程中,甚至上线后,为了更快的追溯问题,都会在本地简历日志目录存放每次程序运行的日志,慢慢的日志会越积越多,这时就需要自动清理历史日志文件

代码示例

import win32con
import win32api
import os
import arrow


def list_files(
        folder_path: str,
        sort_order: str="创建时间",
        include_hidden: bool=False,
        include_subfolders: bool=False,
        reverse: bool=False
    ) -> list:
    """
    列举目标目录下文件

    :param folder_path: 目标文件夹路径
    :param sort_order: 排序方式
    :param include_hidden: 包含隐藏文件
    :param include_subfolders: 包含递归所有子文件夹中的所有文件
    :param reverse: 倒序
    :return files_list: 文件列表
    """
    files_list = []
    # 判断是否要递归所有子文件夹的子文件
    if include_subfolders:
        # 使用 os.walk 函数遍历文件夹及所有子文件夹下所有文件
        for root, _, files in os.walk(folder_path):
            for file in files:
                file_path = os.path.join(root, file)
                # 跳过隐藏文件(如果设置了忽略隐藏文件)
                # win32api.GetFileAttributes(file_path) & win32con.FILE_ATTRIBUTE_HIDDEN == 2 为 True 代表是隐藏文件
                if not include_hidden and (win32api.GetFileAttributes(file_path) & win32con.FILE_ATTRIBUTE_HIDDEN == 2):
                    continue
                files_list.append(file_path)
    else:
        # 直接列出当前文件夹下的文件
        for file in os.listdir(folder_path):
            # 拼接绝对路径
            file_path = os.path.join(folder_path, file)
            # 只要文件
            if os.path.isfile(file_path):
                # 跳过隐藏文件(如果设置了忽略隐藏文件)
                # win32api.GetFileAttributes(file_path) & win32con.FILE_ATTRIBUTE_HIDDEN == 2 为 True 代表是隐藏文件
                if not include_hidden and (win32api.GetFileAttributes(file_path) & win32con.FILE_ATTRIBUTE_HIDDEN == 2):
                    continue
                files_list.append(file_path)
    # 排序
    if sort_order == "创建时间":
        files_list.sort(key=os.path.getctime, reverse=reverse)
    elif sort_order == "修改时间":
        files_list.sort(key=os.path.getmtime, reverse=reverse)
    elif sort_order == "访问时间":
        files_list.sort(key=os.path.getatime, reverse=reverse)
    else:
        raise "Unsupported sorting keywords"
    return files_list


def clear_folder(
        datetime_limit=None,
        num_limit=None,
        **kwargs
    ) -> list:
    """
    清理文件夹,删除文件,不会删除文件夹
    datetime_limit 和 num_limit 都不填写表示删除文件夹下全部文件
    datetime_limit 和 num_limit 都填写保留交集文件

    :param datetime_limit: 选填,保留的日期时间阈值,清除在此日期时间前的所有文件(若只填写日期未填写时间,则默认补充为00:00:00)
    :param num_limit: 选填,保留的数量阈值,保留最新的N条数据,清除其余所有文件

    **kwargs:
    - folder_path 文件夹路径
    - sort_order 排序方式
    - include_hidden 选填,处理隐藏文件
    - include_subfolders 选填,递归处理子文件夹
    """
    # 检查日期时间界限是否为有效的 日期时间
    if datetime_limit:
        datetime_limit = arrow.get(datetime_limit, tzinfo="Asia/Shanghai").timestamp()
    # 检查保留最新多少个文件是否为有效的 整数
    if num_limit:
        num_limit = int(num_limit)
        if num_limit < 0:
            raise "Invalid datetime_limit(日期时间阈值) string or integer"

    # 功能主体
    deleted_files_list = []
    # 列出文件夹中的文件
    files_list = list_files(**kwargs)
    # 1. 处理删除所有的情况
    if (not num_limit and not datetime_limit) or num_limit == 0:
        for file in files_list:
            os.remove(file)
        return files_list
    # 2. 处理 num_limit 需要删除的情况
    if num_limit:
        # 先按个数切
        deleted_files_list.extend(files_list[num_limit:])
        files_list = files_list[:num_limit]
    # 3. 处理 datetime_limit 需要删除的情况
    if datetime_limit:
        if kwargs.get("sort_order") == "创建时间":
            for file in files_list:
                if os.path.getctime(file) < datetime_limit:
                    deleted_files_list.append(file)
        elif kwargs.get("sort_order") == "修改时间":
            for file in files_list:
                if os.path.getmtime(file) < datetime_limit:
                    deleted_files_list.append(file)
        elif kwargs.get("sort_order") == "访问时间":
            for file in files_list:
                if os.path.getatime(file) < datetime_limit:
                    deleted_files_list.append(file)
        else:
            raise "Unsupported sorting keywords"
    # 4. 开始删除文件
    for file in deleted_files_list:
        os.remove(file)
    return deleted_files_list


if __name__ == "__main__":
    print(clear_folder(
        datetime_limit="2023-10-18",
        num_limit=10,
        folder_path=r"C:\Users\name\Desktop\test",
        sort_order="创建时间",
        include_hidden=False,
        include_subfolders=False
    ))
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值