祖父父子后备轮换计算器

GrandFatherSon的Python项目详细描述


grandfatherson是一个备用的旋转计算器,它实现了 grandfather-father-son rotation scheme

这通常是通过每天、每周和 每月备份。应删除较旧的备份以减少 占用的空间。

用法

此模块需要datetime.datedatetime.datetime 对象作为输入。例如,假设您有每日备份 1999年全年需要轮换:

>>> import datetime
>>> start_date = datetime.date(1999, 1, 1)
>>> end_date = datetime.date(1999, 12, 31)
>>> backups = [start_date + datetime.timedelta(days=i)
...            for i in range((end_date - start_date).days + 1)]
>>> backups
[datetime.date(1999, 1, 1),
 datetime.date(1999, 1, 2),
 datetime.date(1999, 1, 3),
 ...
 datetime.date(1999, 12, 30),
 datetime.date(1999, 12, 31)]

假设每周六进行完整备份,增量备份 每天备份。一周或7天的增量备份应该 被保留。保留一个月或4周的完整备份。此外, 在三个月内,每个月都会保留第一次完整备份, 其他的被丢弃了。

这是一年中的最后一天,你想知道哪些备份 需要修剪:

>>> now = datetime.date(1999, 12, 31)

要查看将保留哪些文件,请使用dates_to_keep 功能:

>>> from grandfatherson import dates_to_keep, SATURDAY
>>> sorted(dates_to_keep(backups, days=7, weeks=4, months=3,
...                      firstweekday=SATURDAY, now=now))
[datetime.date(1999, 10, 1),
 datetime.date(1999, 11, 1),
 datetime.date(1999, 12, 1),
 datetime.date(1999, 12, 4),
 datetime.date(1999, 12, 11),
 datetime.date(1999, 12, 18),
 datetime.date(1999, 12, 25),
 datetime.date(1999, 12, 26),
 datetime.date(1999, 12, 27),
 datetime.date(1999, 12, 28),
 datetime.date(1999, 12, 29),
 datetime.date(1999, 12, 30),
 datetime.date(1999, 12, 31)]

如果不使用now参数,则默认使用 datetime.datetime.now()

要查看应删除哪些文件,请使用dates_to_delete 功能:

>>> from grandfatherson import dates_to_delete, SATURDAY
>>> sorted(dates_to_delete(backups, days=7, weeks=4, months=3,
...                        firstweekday=SATURDAY, now=now))
[datetime.date(1999, 1, 1),
 ...
 datetime.date(1999, 9, 30),
 datetime.date(1999, 10, 2),
 ...
 datetime.date(1999, 10, 31),
 datetime.date(1999, 11, 2),
 ...
 datetime.date(1999, 11, 30),
 datetime.date(1999, 12, 2),
 datetime.date(1999, 12, 3),
 datetime.date(1999, 12, 5),
 ...
 datetime.date(1999, 12, 10),
 datetime.date(1999, 12, 12),
 ...
 datetime.date(1999, 12, 17),
 datetime.date(1999, 12, 19),
 ...
 datetime.date(1999, 12, 24)]

最后,如果需要旋转时间戳在 datetime格式,您可以使用相应的to_keepto_delete函数:

>>> now = datetime.datetime(1999, 12, 31, 23, 59, 59)
>>> start_datetime = datetime.datetime(1999, 12, 31, 0, 0, 0)
>>> end_datetime = datetime.datetime(1999, 12, 31, 23, 59, 59)
>>> backups = [start_datetime + datetime.timedelta(seconds=i)
...            for i
...            in range((end_datetime - start_datetime).seconds + 1)]
>>> backups
[datetime.datetime(1999, 12, 31, 0, 0),
 datetime.datetime(1999, 12, 31, 0, 0, 1),
 datetime.datetime(1999, 12, 31, 0, 0, 2),
 ...
 datetime.datetime(1999, 12, 31, 23, 59, 58),
 datetime.datetime(1999, 12, 31, 23, 59, 59)]

>>> from grandfatherson import to_keep
>>> sorted(to_keep(backups, hours=2, minutes=10, seconds=10, now=now))
[datetime.datetime(1999, 12, 31, 22, 0),
 datetime.datetime(1999, 12, 31, 23, 0),
 datetime.datetime(1999, 12, 31, 23, 50),
 ...
 datetime.datetime(1999, 12, 31, 23, 59),
 datetime.datetime(1999, 12, 31, 23, 59, 50),
 ...
 datetime.datetime(1999, 12, 31, 23, 59, 59)]

>>> from grandfatherson import to_delete
>>> sorted(to_delete(backups, hours=2, minutes=10, seconds=10, now=now))
[datetime.datetime(1999, 12, 31, 0, 0),
 ...
 datetime.datetime(1999, 12, 31, 21, 59, 59),
 datetime.datetime(1999, 12, 31, 22, 0, 1),
 ...
 datetime.datetime(1999, 12, 31, 22, 59, 59),
 datetime.datetime(1999, 12, 31, 23, 0, 1),
 ...
 datetime.datetime(1999, 12, 31, 23, 49, 59),
 datetime.datetime(1999, 12, 31, 23, 50, 1),
 ...
 datetime.datetime(1999, 12, 31, 23, 58, 59),
 datetime.datetime(1999, 12, 31, 23, 59, 1),
 ...
 datetime.datetime(1999, 12, 31, 23, 59, 49)]

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何将数据从浏览器拖放到具有自定义MIME类型的java swing应用程序中?   java JMockit:如何模拟受保护的方法?   java为什么待办事项已满时服务器socket连接未被拒绝?   java我应该如何并行化计算代价高昂的for循环并整理迭代结果?   java如何以不同的方式编写这部分代码?   java代码没有看到JTextField的值,尽管它显示在接口中   java我对Spring boot中的bean有问题   java在客户端使用CometD获取传输和EOF异常   如何在Java libGDX中正确地为游戏添加示意图   java捕获异常类型两次   java有没有办法在systemPath中使用变量来实现systemscope依赖关系?   在Java中导入多个类文件   java在Visual Studio代码中配置JDK   java我需要帮助在for循环中使用大写这个词,这个词不是用eclipse编写的,而是从txt文件导入的   JAVAutil。scanner类Java读取的输入值太多   java REST Web服务是否支持提供zip文件的范围标头?   java在java代码中生成安全的SQL