Python резервное копирование на FTP
05 июня 2024 г.
Всегда приходится делать резервное копирование на внешний ресурс. Ниже представлен простой скрипт для резервного копирования на внешний FTP ресурс.
Скрипт написан на Python3
#!/usr/bin/python3
# -*- encoding: utf-8 -*-
import zipfile, os, sys
import datetime
import io
import shutil
import ftplib
import datetime
host = 'прописать хост'
user = 'Логин'
password = 'Пароль'
# Сколько копий хранить на FTP
max_files = 5
# Папка которую архивируем, либо несколько папок через запятую
backup_dir = ['C:/Program Files (x86)/7-Zip']
# Рабочий каталог в котором исполняемый файл тут же временный архив
work_dir = 'D:/PythonProjects/FTPBackup/'
# Текущая дата для архива
now = datetime.datetime.now()
print(os.path.join(backup_dir[0]))
if __name__ == '__main__':
print("ZIP to FTP Backup Tool")
print("v1.0 - Andrey Garkin")
print("a.garkin@itlab73.ru")
print("\n====================")
def progress():
def callback(block):
callback.uploaded += len(block)
print('Upload %d bytes' % callback.uploaded)
callback.uploaded = 0
return callback
# Функция удаления файлов
def remove_old():
#Удалить все старые файлы
all_files = [x for x in ftp.nlst()]
diff = len(all_files) - max_files
if diff > 0:
for file in all_files[:diff]:
ftp.delete(file)
"""
def zip_directory(folder_path, zip_file):
for folder_name, subfolders, filenames in os.walk(folder_path):
for filename in filenames:
# Создаем полный путь до файла
file_path = os.path.join(folder_name, filename)
# Добавляем файлы в архив
zip_file.write(file_path)
print("Create archive")
zip_file = zipfile.ZipFile(work_dir + 'backup-' + now.strftime("%d-%m-%Y-%H-%M-%S") + '.zip', 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
zip_directory(backup_dir, zip_file)
# Закрываем архив
zip_file.close()
"""
def zip_directory(backup_dir, zip_file):
for folder in backup_dir:
for dirpath, dirnames, filenames in os.walk(folder):
for filename in filenames:
# Добавляем файлы в архив
zip_file.write(os.path.join(dirpath, filename), os.path.relpath(os.path.join(dirpath, filename), os.path.join(backup_dir[0], '../..')))
# Закрываем архив
zip_file.close()
print("Create archive")
zip_file = zipfile.ZipFile(work_dir + 'backup-' + now.strftime("%d-%m-%Y-%H-%M-%S") + '.zip', 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
zip_directory(backup_dir, zip_file)
print("\n=====")
print("Connect to FTP server...")
ftp = ftplib.FTP(host)
print("Login to FTP server...")
ftp.login(user,password)
ftp.cwd('files') # переходим в директорию files
print("Get directories...")
ftp.retrlines('LIST')
print("Upload archive...")
try:
# get all files inside a specific folder r'D:\\PythonProjects\\FTPBackup'
dir_path = work_dir
for file in os.listdir(dir_path):
if file.endswith(".zip"):
fullname = os.path.join(file)
print(fullname)
ftp.storbinary('STOR ' + fullname, open(fullname, 'rb'), 8192, progress())
print("Upload successful!")
# Удаление файлов
remove_old()
except ftplib.all_errors as e:
print(e)
error = True
print("Connection close...")
ftp.close()
print("Remove local archive...")
os.remove(dir_path + fullname)
# Для отладки видеть что происходит. На боевом отключить
# Python 2
# raw_input("Press enter to exit:")
# Python 3
input("Press enter to exit:")
Если вдруг у Вас возникнут сложности с настройкой резервного копирования, Вы всегда можете обратиться ко мне за консультацией.
Благодарность за статью 100 рублей.