背景
开发调试过程中,甚至上线后,为了更快的追溯问题,都会在本地简历日志目录存放每次程序运行的日志,慢慢的日志会越积越多,这时就需要自动清理历史日志文件
代码示例
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
))