Бэкапы я не делал давно. Было лень, да и данные я не терял уже несколько лет. Но недавно задумался об этом и решил-таки сделать что-то такое, что резервно сохраняло бы то, что не очень хочется потерять. Просто что бы скучно не было, и немного попрактиковаться.
Для начала нужно определиться где хранить копии файлов. По-моему DropBox это очень хороший выбор — это сервис для синхронизации данных на разных компьютерах. Бесплатно дают 2 Гб, плюс программу, которая отображает выбранную локальную папку на ихнее онлайн хранилище.
Добавил файл в эту специальную папку — он добавился на всех компьютерх, на которых стоит специальная программа, настроенная на тот же аккаунт. Плюс доступ через веб-интерфейс. Для бэкапа это очень удобно — не надо заморчиваться как скопировать файлы на FTP, а просто копируем их в специальную папку. Всё работу по заливке/синхронизации сделает DropBox клиент.
Дальше нужно собственно скопировать необходимые файлы. Для этого был написан крохотульный скрипт на питоне, backup.py. Этот скрипт создаёт текстовый список файлов, которые нужно скопировать, и передаёт его WinRar’у, который создаёт архив с указанным именем.
Часть 7. Решение задач . Практические изучение Python по книге «Укус Питона»-A Byte of Python
Сначала я хотел полностью поручить WinRar’у создание бэкапа, написав немного кода в батниках, но к сожалению он не умеет пропускать заданные папки (только файлы). Поэтому пришлось писать промежуточный скрипт, который создаёт список файлов. Ну и хорошо, так даже веселее.
У скрипта есть единственный параметр — имя выходного файла-архива со скопированными файлами.
- Читает из текущей папки файл tobackup.lst — там хранится список папок, которые нужно скопировать. Каждая строка — отдельная папка. Например:
d:projects
d:www - Читает список папок, которые нужно исключить из бэкапа. Это опциональный файл igonre.lst в текущей папке. Это либо полный путь (d:projectsold), либо просто имя папки (.svn). Например:
.svn
d:projectsold - Создаёт текстовый список файлов для копирования list.lst (в текущей папке). После этого добавляет в конец файла-списка опциональный файл extra.lst (из текущей папки). Там содержится список файлов, а не папок, для включения. Например, мы хотим сохранить настройки php, но из всей папки d:programsphp нам нужен только один файл php.ini. Поэтому вместо добавления папки с php мы добавляем только один файл php.ini в extra.lst.
- Вызывает архиватор, который создаёт архив с файлами из списка. Параметры архиватора — сохранять полный путь файлов (вместе с диском) и создать архив без сжатия.
Я не зря указывал, что скрипт берёт файлы из текущей папки. Благодаря этому делать разные «профили» очень просто — достаточно создать новую папку, создать там файл tobackup.lst, опциональные ignore.lst и extra.lst, и новый профиль готов! Для удобства можно сделать батник, который будет вызывать backup.py и передавать ему имя файла-архива который должен получиться.
Сейчас, например, у меня есть две папки-профиля, projects (для бэкапа текущих проектов) и other (для бэкапа настроек программ). Сам скрипт лежит в папке core (на том же уровне что и папки профилей), вместе с WinRar’ом.
Составить программу, которая создаёт резервные копии всех наших важных файлов
Папка core:
Rar.exe
WinRAR.exe
rarreg.key
backup.py
Папка projects:
tobackup.lst:
d:projects
d:svn
ignore.lst:
.svn
d:projectsold
backup.bat:
..corebackup.py «d:dropboxmy dropboxbackupdev.rar»
Батник backup.bat вызывает скрипт, передеаёт ему имя получающегося файла-архива, который будет создан в папке, связанной с DropBox. Скрипт берёт файлы-списки из текущей папки (projects в данном случае). Один запуск батника — новый бэкап готов, и DropBox грузит его на сервер.
Осталось прикрутить запуск по расписанию, но меня устроит и ручной запуск несколько раз в месяц.
UPD. Новая версия тут.
Источник: habr.com
Резервное копирование
Рассмотрим сегодня практическую часть написания кода(на мой взгляд самую важную). А точнее, сделаем резервное копирование( = backup) важных данных.
По ходу чтения всем вам известной книги «Укус питона» («A byte of Python») я столкнулся с задачей, в которой требуется сделать backup.
Перед нами стоит следующая задача: Составить программу, которая создаёт резервные копии всех наших важных файлов. Хотя задача и проста, информации явно недостаточно, чтобы приступать к её решению. Необходим некоторый дополнительный анализ. Например, как мы выберем, какие файлы необходимо копировать? Как их хранить?
Где их хранить?
Я подумал о том, как я это сделаю. Думал долго и тщательно, пока не наткнулся на решение, что было ниже на пару страниц
Так вот, решение оказалось не самым сложным и некоторые вещи я понял правильно. В книге предлагается 4 варианта программы резервного копирования(я решил написать вам о 3-х, потому что 3-ий и 4-ий варианты отличаются одним знаком «»)
Вариант первый
Первая программа сделана без лишних усложнений. Вот алгоритм кода первой версии backup`а:
1. Файлы и каталоги, которые необходимо скопировать, собираются в список.
2. Резервные копии должны храниться в основном каталоге резерва.
3. Файлы помещаются в zip-архив.
4. Именем для zip-архива служит текущая дата и время.
Для того, чтобы использовать то, что мы запланировали нам потребуются модули os и time.
С помощью os.sep Python ставит разделитель. Для Windows это «\», для Mac «:», а для Linux «/». Это такой универсальный способ написания пути файла.
С помощью time.strftime мы даём название нашему архиву.
target_dir — место расположения архива.
В переменной zip_command мы прописываем zip -qr, что значит создание zip с условиями queitly = тихо и recursive = рекурсивно. Далее с помощью метода join мы превращаем список в строку.
И, наконец, с помощью функции os.system мы запускаем команду так, будто она запущена из системы. На этом наш алгоритм окончен.
Вариант второй, улучшенный
Здесь мы добавляем несколько вещей, таких как:
- Использование времени в качестве имени файла
- Проверка на наличие папки с сегодняшней датой
Все нововведения только улучшают работу кода. Вот, что об этом говорит автор:
Первое достоинство этого состоит в том, что копии хранятся в иерархической структуре, которой легче управлять. Второе достоинство – в том, что имена файлов намного короче. Третье достоинство состоит в том, что по именам каталогов можно легко определить, в какие дни создавались резервные копии, так как каталог создаётся только в случае резервного копирования данных в этот день.
Вариант третий, он же конечный вариант кода
Улучшения в третьей версии:
- Запрос комментария от пользователя и проверка его наличия
- Добавление комментария пользователя в название архива (естественно при наличии комментария)
Подводим итоги
Таким образом, мы написали прекрасную backup-программу, которой можно пользоваться для копирования важных данных и хранения их в упорядоченном виде. Я считаю, что данный код уже довольно-таки неплох, потому что мы работаем с различными функциями, модулями и переменными. По ходу написания backup`а я придерживался алгоритма, о котором говорит Swaroop. Считаю этот алгоритм универсальным, поэтому:
Самое главное, что мы должны запомнить из этой статьи —
Алгоритм написания любой программы:
- Что (Анализ)
- Как (Проектирование)
- Создание (Реализация)
- Тестирование (Тестирование и Отладка)
- Использование (Развёртывание и Оперирование)
- Поддержка (Усовершенствование)
В нашем Telegram-канале будут размещены все три версии резервного копирования в формате .
На этом я прощаюсь с вами, друзья! До следующей статьи
Источник: telegra.ph
Русские Блоги
«Байт Python3» Глава 11 Процедура создания резервной копии
«Я хочу написать программу, которая может создавать резервные копии всех моих важных файлов».
- Файлы и каталоги для резервного копирования указаны в списке.
- Резервная копия должна храниться в основном каталоге резервных копий.
- Файл создается в виде zip-файла.
- Имя zip-архива — это текущая дата и время.
- Мы используем стандартную команду zip, которая обычно предоставляется по умолчанию в дистрибутивах Linux / Unix. Пользователи Windows могут установить со страницы проекта GnuWin32. Обратите внимание, что вы можете использовать любую команду архивирования, если она имеет интерфейс командной строки, и в этом случае мы можем передать ей параметры из нашего скрипта.
# !/usr/bin/env python3 # -*- coding: utf-8 -*- # Filename: backup_ver1.py import os import time # 1. Файлы для резервного копирования в виде списка # Под окнами: # source = [‘»C: \ Мои документы»‘, ‘C: \ Code’] # куда бежать # В Mac OS X и Linux: source = [‘/ Users / Lazyant / Documents / Learning / Pythonlearn / Практические вопросы’] # 2. Целевой каталог архива, не забудьте изменить путь на путь к вашему компьютеру. target_dir = ‘/ Пользователи / Lazyant / Documents / Learning / Pythonlearn / backup’ # 3. Создайте резервную копию файлов в zip-архиве. # Назовите zip-файл текущей датой # time.strftime () Получить время # os.sep предоставит разделитель путей в соответствии с операционной системой, например ‘\’ в Windows target = target_dir + os.sep + time.strftime(‘%Y%m%d%H%M%S’) + ‘.zip’ # 4. Если папка не существует, создайте папку if not os.path.exists(target_dir): os.mkdir(target_dir) # 5. Создайте строку zip_command, которая содержит команду zip, которую нужно выполнить # Используемая команда zip имеет некоторые параметры и переданные параметры. Параметр -q указывает, что команда zip должна выполняться быстро. Параметр -r указывает, что команду zip следует повторять для каждого каталога, например, он должен включать все подкаталоги и файлы. Эти два параметра можно комбинировать с -qr. # Используйте метод соединения для преобразования списка ресурсов в строку zip_command = «zip -r «.format(target,’ ‘.join(source)) # Запускать команды с помощью функции os.system print(‘Zip command is:’) print(zip_command) print(‘Running:’) if os.system(zip_command) == 0: print(‘Successful backup to’,target) else: print(‘Backup FAILED’)
Версия вторая
Оптимизация: используйте время в качестве имени файла и текущую дату в качестве имени каталога и сохраните его в основном каталоге резервных копий.
. # 3. Создайте резервную копию файлов в zip-архиве. # Назовите подкаталог в основном каталоге с текущей датой today = target_dir + os.sep + time.strftime(‘%Y%m%d’) # Назовите zip после текущего времени now = time.strftime(‘%H%M%S’) target = today + os.sep + now + ‘.zip’ # 4. Если папка не существует, создайте папку if not os.path.exists(target_dir): os.mkdir(target_dir) if not os.path.exists(today): os.mkdir(today) print(‘Successful created directory’,today) . .
Версия третья:
Оптимизация: добавьте примечания к имени файла.
. # 3. Создайте резервную копию файлов в zip-архиве. # Назовите подкаталог в основном каталоге с текущей датой today = target_dir + os.sep + time.strftime(‘%Y%m%d’) # Назовите zip после текущего времени now = time.strftime(‘%H%M%S’) # Добавить заметку comment = input(‘Enter a comment —>’) # Проверить введенные заметки if len(comment) == 0: target = today + os.sep + now + ‘.zip’ else: target = today + os.sep + now + ‘_’ + comment.replace(‘ ‘,’_’) + ‘.zip’ .
Для большинства пользователей четвертая версия является удовлетворительным рабочим сценарием, но ее все еще можно улучшить. Например, вы можете указать степень взаимодействия в программе — вы можете использовать параметр -v, чтобы сделать вашу программу более интерактивной.
Еще одно возможное улучшение — это возможность передавать файлы и каталоги непосредственно в сценарий через командную строку. Мы можем получить их через список sys.argv, а затем мы можем использовать метод расширения, предоставляемый классом списка, чтобы добавить их в исходный список.
Наиболее важным усовершенствованием является не использование os.system для создания сжатых файлов, а использование встроенных модулей zipfile или tarfile для создания сжатых файлов. Они являются частью стандартной библиотеки, не зависят от внешних почтовых программ на вашем компьютере и уже доступны.
Однако в приведенном выше примере я использовал os.system для создания резервной копии. Это сделано исключительно для удобства обучения, поэтому пример достаточно прост, чтобы его могли понять все. достаточно.
Можете ли вы попробовать использовать модуль zipfile вместо os.system для написания четвертой редакции?
Источник: russianblogs.com