代码:
import os
import shutil
import time
from datetime import datetime
class AutoBackup:
def __init__(self, source_folder, backup_folder, backup_interval=86400, keep_versions=5):
"""
自动化备份工具
:param source_folder: 需要备份的源文件夹路径
:param backup_folder: 备份文件夹路径
:param backup_interval: 备份间隔时间(秒),默认值为 86400 秒(1天)
:param keep_versions: 保留的历史备份版本数,默认值为 5
"""
self.source_folder = source_folder
self.backup_folder = backup_folder
self.backup_interval = backup_interval
self.keep_versions = keep_versions
self.last_backup_time = None
def backup(self):
"""
执行备份操作
"""
# 检查源文件夹和备份文件夹是否存在
if not os.path.exists(self.source_folder):
print(f"源文件夹 {self.source_folder} 不存在,无法执行备份!")
return
if not os.path.exists(self.backup_folder):
os.makedirs(self.backup_folder)
print(f"备份文件夹 {self.backup_folder} 不存在,已创建该文件夹。")
# 获取当前时间戳
current_time = time.time()
# 判断是否需要执行备份(根据备份间隔)
if self.last_backup_time is None or current_time - self.last_backup_time >= self.backup_interval:
# 获取当前时间并创建备份目录
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_dir = os.path.join(self.backup_folder, f"backup_{timestamp}")
os.makedirs(backup_dir)
# 复制文件到备份目录
self._copy_files(self.source_folder, backup_dir)
print(f"备份已完成,文件已复制到 {backup_dir}")
# 更新最后备份时间
self.last_backup_time = current_time
# 清理旧备份,只保留最新的 N 个备份
self._clean_old_backups()
else:
print(f"距离上次备份不足 {self.backup_interval} 秒,跳过本次备份。")
def _copy_files(self, source, destination):
"""
复制文件到指定目标文件夹
:param source: 源文件夹路径
:param destination: 目标文件夹路径
"""
# 遍历源文件夹中的文件和子文件夹
for item in os.listdir(source):
source_path = os.path.join(source, item)
destination_path = os.path.join(destination, item)
if os.path.isdir(source_path):
shutil.copytree(source_path, destination_path)
else:
shutil.copy2(source_path, destination_path)
def _clean_old_backups(self):
"""
清理旧备份,只保留最新的 N 个备份
"""
# 获取备份文件夹中的所有备份文件夹
backup_subfolders = [f.path for f in os.scandir(self.backup_folder) if f.is_dir() and f.name.startswith('backup_')]
# 按照创建时间排序备份文件夹
backup_subfolders.sort(key=lambda x: os.path.getctime(x), reverse=True)
# 删除多余的备份,只保留最新的 N 个
if len(backup_subfolders) > self.keep_versions:
for old_backup in backup_subfolders[self.keep_versions:]:
shutil.rmtree(old_backup)
print(f"已删除旧的备份文件夹: {old_backup}")
# 示例使用
if __name__ == "__main__":
# 设置源文件夹和备份文件夹路径
source_folder = "example_source_folder" # 替换为实际源文件夹路径
backup_folder = "example_backup_folder" # 替换为实际备份文件夹路径
backup_interval = 86400 # 每天备份一次(24小时),单位:秒
keep_versions = 5 # 保留最新的5个备份版本
# 创建自动备份工具实例并执行备份
auto_backup = AutoBackup(source_folder, backup_folder, backup_interval, keep_versions)
auto_backup.backup()
代码说明:
这个 Python 程序实现了一个自动化备份工具,可以定时备份指定的文件夹,并根据指定的保留备份版本数量来清理旧的备份文件。它的主要功能包括定期备份、复制文件、保持最新备份版本、删除过期备份等。
-
AutoBackup类:这是实现自动备份功能的核心类,包含了初始化方法和备份操作的方法。通过初始化时传入源文件夹路径、备份文件夹路径、备份间隔时间(单位:秒)以及保留备份版本的数量。
-
backup方法:这个方法执行备份操作。根据指定的备份间隔时间(默认每天一次),如果到了备份时间,就会创建一个新的备份文件夹,并将源文件夹中的所有文件和子文件夹复制到备份文件夹中。
-
_copy_files方法:这个方法用于递归地将源文件夹中的所有文件和文件夹复制到目标备份文件夹中,确保备份是完整的。
-
_clean_old_backups方法:这个方法用于清理旧的备份文件夹。它会检查备份文件夹中的所有备份,并删除超过保留版本数量的备份文件夹,只保留最新的 N 个备份。
-
时间控制:使用
time.time()获取当前时间戳,并根据上次备份的时间与当前时间的差来决定是否需要进行备份。
使用说明:
-
设置源文件夹和备份文件夹:
source_folder是需要备份的源文件夹路径,程序会从该文件夹中复制所有文件和子文件夹。backup_folder是备份文件夹的路径,备份的文件将存储在该文件夹内。
-
设置备份间隔:
backup_interval是备份间隔时间,单位是秒,默认值为 86400 秒(即每天备份一次)。你可以根据需要设置为其他时间间隔,如每小时(3600秒)备份一次。
-
设置保留备份版本数:
keep_versions是保留的最新备份版本数量,默认值是 5。如果备份超过这个数量,程序会自动删除最旧的备份,确保备份文件夹的空间不会过载。
-
执行备份:
- 运行
auto_backup.backup()方法,程序会自动执行备份操作。如果到达备份间隔,程序会将源文件夹中的内容复制到备份文件夹,并在备份文件夹内创建以时间戳命名的子文件夹来保存备份。
- 运行
示例使用:
if __name__ == "__main__":
source_folder = "example_source_folder" # 源文件夹路径
backup_folder = "example_backup_folder" # 备份文件夹路径
backup_interval = 86400 # 每天备份一次
keep_versions = 5 # 保留最新的5个备份版本
auto_backup = AutoBackup(source_folder, backup_folder, backup_interval, keep_versions)
auto_backup.backup()
示例运行结果:
假设源文件夹 example_source_folder 包含以下文件:
file1.txtfile2.txtsubfolder/
每次执行备份时,程序会创建一个以时间戳为名的子文件夹,如 backup_20250403_123456/,并将源文件夹中的所有文件和子文件夹复制到该备份文件夹中。程序还会自动清理旧备份,确保备份文件夹中只保留最新的 5 个备份版本。
注意事项:
- 确保源文件夹和备份文件夹的路径是正确的。
- 备份间隔的设置应该根据实际需求进行调整,避免过于频繁或过长时间的间隔。
- 保留的备份版本数量不宜过多,以免占用过多存储空间。

523

被折叠的 条评论
为什么被折叠?



