Задать вопрос
MinuteX
@MinuteX
Люблю чай и играть

Можете оценить код?

Это программа для бэкапа папок/файлов

import shutil
import time
from datetime import datetime

i = 0
t = 3 #Сбда вписать раз в сколько СЕКУНД делать бэкап

while 1 == 1:

	dt = datetime.today().strftime("%Y-%m-%d-%H.%M.%S")
	name = "backup_"

	new_name = name + str(i)

	directory_copy = 'C:\\Users\\MinuteX\\Downloads\\This is a server of MC\\fantasy_city' #Вписать директория откуда копировать папку ||| ВАЖНО!!! С ДВОЙНЫМ СЛЕШОМ
	directory = 'C:\\Users\\MinuteX\\Downloads\\Safe' #Впмсать директорию куда будут копироватся файлы, ||| ВАЖНО!!! ВСЕ СЛЕШЫ ДОЛЖНЫ БЫТЬ ДВОЙНЫМИ

	v_DIR = directory + '\\' + new_name + "_" + dt
	i += 1


	shutil.make_archive(v_DIR,
	                    'zip',
	                     directory_copy)

	print("Generate new backup: " + v_DIR)
	time.sleep(t)
  • Вопрос задан
  • 417 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 2
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Начните с приведения кода в соотвествии со стандартами pep8
5e6777e34a46f746495755.png

Беглым взглядом:
while 1 == 1:
лучше заменить на
while True:
зачем вызывать операцию сравнения, если результат и так известен...
directory_copy = 'C:\\Users\\MinuteX\\Downloads\\This is a server of MC\\fantasy_city' #Вписать директория откуда копировать папку ||| ВАЖНО!!! С ДВОЙНЫМ СЛЕШОМ
directory = 'C:\\Users\\MinuteX\\Downloads\\Safe' #Впмсать директорию куда будут копироватся файлы, ||| ВАЖНО!!! ВСЕ СЛЕШЫ ДОЛЖНЫ БЫТЬ ДВОЙНЫМИ

почитайте за os.path.join

v_DIR = directory + '\\' + new_name + "_" + dt
Почитайте за os.path.join и f-строки

Всю вашу конструкцию в 5 строк можно привести к такому более читабельному виду к примеру:
destination_file = os.path.join(
    DESTINATION_DIR,
    f'backup_{i}_{datetime.today().strftime("%Y-%m-%d-%H.%M.%S")}',
)


directory_copy = ...
directory = ...

вынести за пределы цикла - в цикле вы присваиваете им циклически одно и то же значение, и дать более осмысленные наименования

В логику - не вникал...
Ответ написан
Комментировать
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
К тому, что перечислил @fox_1 добавлю:
  1. используйте pathlib;
  2. выносите магические константы ("%Y-%m-%d-%H.%M.%S") в начало модуля, именуйте их внятно;
  3. используйте argparse;
  4. принимайте пути ('C:\\Users\\MinuteX\\Downloads\\This is a server of MC\\fantasy_city') в параметрах, можно использовать безопасные умолчания и относительные пути;
  5. не конкатенируйте строки (а особенно пути) плюсиком, используйте f-строки или .format(...);
  6. соберите код в функции, сделайте точку входа, анализируйте аргументы командной строки - даже в простых скриптах эта привычка даст вам много очков к опыту и привьёт правильный аккуратный подход к разработке инструментов;
  7. в простых скриптах print - это нормально, но лучше использовать logging, чтобы ваш код можно было использовать как модуль и переопределить логированаие;
  8. делайте выхлоп ошибок в stderr, а всякий полезный выхлоп в stdout, это позволит в командной строке на уровне пайпов направить логи работы вышего скрипта в разные файлы или потоки;
  9. не рассчитывайте, что ваш код будет работать вечно и стабильно. Сейчас у вас период бэкапа нестабильный, зависит от продолжительности самого бэкапа - это, как минимум, странно и неожиданно. Я бы такую штуку сделал простой и одношговой, то есть при запуске утилита делает один единственный бэкап и завершается с ошибкой, если что-то пошло не так. Это позволит занести её в crontab или в планировщик задач, а результаты работы и успешность запуска оценивать внешними механизмами;
  10. старайтесь всегда делать кросс-платформенный код, даже если он вряд ли будет запускаться на других ОС, даже если у вас нет времени протестировать его на разных ОС -- это сформирует у вас хорошую привычку и расширит кругозор, а также позволит не делать лишних специфических костылей.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@deliro
Очень плохо
Ответ написан
Комментировать
@Andy_U
Я бы еще обернул shutil.make_archive в try-catch. Всякое может произойти. Типа файл заблокирован для чтения, стерся в процессе и т.д. и т.п.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы