Найти в Дзене
IT-кот

Программа для создания резервных копий на Python. Учись с нами!

Напиши собственную программу!!!
Оглавление
Резервные копии на Python 3
Резервные копии на Python 3

Привет, наверное, ты уже знаешь, что главное в изучении программирования - это практика?! Сегодня мы создадим простенькую программу, которая создает резервную копию данных с помощью архиватора! Давай перейдем сразу к делу! Не волнуйтесь, это проще, чем кажется!

Подготовка к составлению программы

Для составления программы нам потребуется стандартная команда zip. Она установлена по умолчанию в любом стандартном дистрибутиве Linux.

Если вы пользователь операционной системы Windows, то для использования этой команды вам необходимо скачать и установить пакет zip со страницы GnuWin32. При установке оставьте стандартный путь "C:\Program Files (x86)\GnuWin32" либо "C:\Program Files\GnuWin32".
Далее нужно добавить путь "C:\Program Files (x86)\GnuWin32\bin" либо "C:\Program Files\GnuWin32\bin" (в зависимости от того, куда у вас установился этот пакет) в системную переменную окружения PATH. Для этого на панели задач в поиске введите "изменение системных переменных среды", как показано на картинке:
Меню поиска
Меню поиска
Далее в свойствах системы нужно выбрать "Переменные среды..." и создать новую системную переменную, как показано на картинке:
Добавление системной переменной PATH
Добавление системной переменной PATH

Перейдем к проектированию программы.

Проектирование программы

Итак, нам нужно составить программу, которая создает резервные копии необходимых нам данных. Для этого нам необходимо:

  1. выбрать папки и файлы, копии которых нужно создать;
  2. выбрать папку, в которой будут храниться резервные копии;
  3. архивировать данные и при желании добавить комментарий, наименованием будут служить текущие дата и время

Составление программы

Перейдем к составлению программы.

Импорт модулей для для управления системой и временем - os и time:

import os
import time

В переменной what_to_reserve выбираем пути мест, которые нужно копировать, а в переменной where_to_save выбираем путь, куда сохранять резервные копии. У вас должны быть свои пути (если вы пользователь Windows, то используйте двойной слеш в указании пути (\\)):

Windows:

what_to_reserve = ['"C:\\Users\\forvi\\Documents\\Study"', '"C:\\Users\\forvi\\Documents\\Photo"']
where_to_save = 'D:\\Backup'

Linux (заметьте, что слеш обратный):

what_to_reserve = ['/home/jack/Study', '/home/jack/Photo']
where_to_save = '/home/jack/Backups'

Получение сегодняшней даты для составления имени и пути архива и получение времени для составления имени архива:

today = where_to_save + os.sep + time.strftime('%Y%m%d')
now = time.strftime('%H%M%S')

В переменной today мы склеиваем путь для сохранения копий и сегодняшнюю дату с помощью os.sep (это означает \\ в Windows или / в Linux. В итоге today будет равен "D:\\Backup\\текущая дата". Переменная now получает значение текущего времени также для составления названия нашего архива.

Запрос комментария, который будет добавлен к названию архива:

comment = input('Введите комментарий: ')
if len(comment) == 0:
target = today + os.sep + now + '.zip'
else:
target = today + os.sep + now + '_' + comment.replace(' ', '_') + '.zip'

С помощью функции input мы получаем комментарий, далее идет проверка, если длина комментария равна 0 (то есть комментарий пуст), то название архива останется неизменным. Если комментарий не пуст, то введенный комментарий будет добавлен к названию архива. Функция replace здесь необходима для того, чтобы при вводе комментария с пробелами заменить пробелы на нижние подчеркивания.

Создаем каталог, если его еще не существует:

if not os.path.exists(today):
os.mkdir(today)
print('Каталог успешно создан', today)

Первая строка проверяет, создана ли папка для создания резервных копий. Если ее не существует, то система создаст нужный каталог и выведет сообщение об этом.

Использование команды 'zip' для помещения файлов в zip-архив:

zip_command = "zip -qr {0} {1}".format(target, ' '.join(what_to_reserve))

Переменная zip_command содержит команду, которую мы передадим системе для исполнения. Команде zip нужно передать параметры "-q" и "-r", если их объединить, то можно указать это так "-qr". С этими двумя параметрами программа будет выполняться тихо (-q - без вывода подробостей) и рекурсивно для каталогов (-r - должна включать все подкаталоги и файлы). Выражения {0} и {1} содержат в себе переменную target и what_to_reserve соответственно с помощью функции format().

Запуск резервного копирования:

if os.system(zip_command) == 0:
print("Резервная копия успешно создана в", target)
else:
print("Ошибка!")

Система получает собранную нами комману на выполнение. Если ничего плохого не происходит, то копирование пройдет успешно. В случае каках-либо неполадок программа сообщит об этом.

Если всё прошло удачно, то вы увидите такой результат:

Если вы пользователь Windows:

Результат на Windows
Результат на Windows

Если вы пользователь Linux:

Результат на Linux
Результат на Linux

Полный код программы

Для Windows:

import os
import time
what_to_reserve = ['"C:\\Users\\forvi\\Documents\\Study"', '"C:\\Users\\forvi\\Documents\\Photo"']
where_to_save = 'D:\\Backup'
today = where_to_save + os.sep + time.strftime('%Y%m%d')
now = time.strftime('%H%M%S')
comment = input('Введите комментарий: ')
if len(comment) == 0:
target = today + os.sep + now + '.zip'
else:
target = today + os.sep + now + '_' + comment.replace(' ', '_') + '.zip'
if not os.path.exists(today):
os.mkdir(today)
print('Каталог успешно создан', today)
zip_command = "zip -qr {0} {1}".format(target, ' '.join(what_to_reserve))
if os.system(zip_command) == 0:
print("Резервная копия успешно создана в", target)
else:
print("Ошибка!")

Для Linux:

import os
import time
what_to_reserve = ['/home/jack/Study', '/home/jack/Photo']
where_to_save = '/home/jack/Backups'
today = where_to_save + os.sep + time.strftime('%Y%m%d')
now = time.strftime('%H%M%S')
comment = input('Введите комментарий: ')
if len(comment) == 0:
target = today + os.sep + now + '.zip'
else:
target = today + os.sep + now + '_' + comment.replace(' ', '_') + '.zip'
if not os.path.exists(today):
os.mkdir(today)
print('Каталог успешно создан', today)
zip_command = "zip -qr {0} {1}".format(target, ' '.join(what_to_reserve))
if os.system(zip_command) == 0:
print("Резервная копия успешно создана в", target)
else:
print("Ошибка!")

В своей другой публикации я советовал путь изучения Python, советую ознакомиться, вот ссылка!

Удачи вам в освоении такого замечательного языка программирования как Python!!!