问:用Python写一个定期删除备份文件的程序,文件名含有日期。要求每月2日删除上月文件名含有日期20日~31日的文件,每月12日删除文件名含有当月1日~9日的程序,每月22日删除10日~19日的程序。日期格式是YYYY-MM-DD,目录是/root/bak
豆包:
import os
import datetime
def get_current_date():
return datetime.datetime.now()
def delete_files_with_dates(folder_path, start_date, end_date):
for root, dirs, files in os.walk(folder_path):
for file in files:
for date in range(start_date, end_date + 1):
date_str = str(date).zfill(2)
if date_str in file:
file_path = os.path.join(root, file)
try:
os.remove(file_path)
print(f"已删除文件: {file_path}")
except Exception as e:
print(f"删除文件 {file_path} 时出错: {e}")
def main():
folder_path = '.' # 备份文件所在的文件夹路径,可根据实际情况修改
current_date = get_current_date()
current_day = current_date.day
current_month = current_date.month
current_year = current_date.year
if current_day == 2:
last_month = current_month - 1 if current_month > 1 else 12
last_year = current_year if current_month > 1 else current_year - 1
start_date = 20
end_date = 31
delete_files_with_dates(folder_path, start_date, end_date)
elif current_day == 12:
start_date = 1
end_date = 9
delete_files_with_dates(folder_path, start_date, end_date)
elif current_day == 22:
start_date = 10
end_date = 19
delete_files_with_dates(folder_path, start_date, end_date)
if __name__ == "__main__":
main()
好家伙,主程序三个for循环,直接pass。下面看DeepSeek。
DP:省略一大段各种分析,直接贴代码。
import os
import re
from datetime import datetime, timedelta
import sys
def parse_date_from_filename(filename, date_pattern):
"""从文件名中解析日期(支持YYYY-MM-DD格式)"""
match = date_pattern.search(filename)
if not match:
return None
date_str = match.group()
try:
return datetime.strptime(date_str, "%Y-%m-%d").date()
except ValueError:
return None
def get_target_dates(today):
"""根据当前日期获取目标删除范围"""
if today.day == 2:
# 处理上月20号到月底
current_month_first = today.replace(day=1)
prev_month_last_day = current_month_first - timedelta(days=1)
return {
"year": prev_month_last_day.year,
"month": prev_month_last_day.month,
"start_day": 20,
"end_day": prev_month_last_day.day
}
elif today.day == 12:
# 处理当月1-9号
return {
"year": today.year,
"month": today.month,
"start_day": 1,
"end_day": 9
}
elif today.day == 22:
# 处理当月10-19号
return {
"year": today.year,
"month": today.month,
"start_day": 10,
"end_day": 19
}
return None
def main():
# 硬编码备份目录
backup_dir = "/root/bak"
# 检查目录是否存在
if not os.path.isdir(backup_dir):
print(f"错误:备份目录 {backup_dir} 不存在")
sys.exit(1)
today = datetime.today().date()
target = get_target_dates(today)
if not target:
print("今天不是计划清理日期(每月2、12、22日)")
sys.exit(0)
date_pattern = re.compile(r"\d{4}-\d{2}-\d{2}") # YYYY-MM-DD格式
deleted_count = 0
for filename in os.listdir(backup_dir):
file_path = os.path.join(backup_dir, filename)
if os.path.isfile(file_path):
file_date = parse_date_from_filename(filename, date_pattern)
if file_date:
if (file_date.year == target["year"] and
file_date.month == target["month"] and
target["start_day"] <= file_date.day <= target["end_day"]):
try:
os.remove(file_path)
print(f"已删除:{filename}")
deleted_count += 1
except PermissionError:
print(f"权限不足无法删除:{filename}")
except Exception as e:
print(f"删除失败[{filename}]: {str(e)}")
print(f"清理完成,共删除 {deleted_count} 个文件")
if __name__ == "__main__":
# 添加权限警告
if os.geteuid() != 0:
print("警告:/root 目录需要root权限,请使用sudo运行")
sys.exit(1)
main()
复杂,不直观。下面是我用大白话编写的。


简单易懂。
