Пакетное сжатие картинок с помощью Python на FTP — обновленное

Привет всем! Вот тут я рассказывал о вопросе, который звучит как: Пакетное сжатие картинок с помощью Python на FTP. Сегодня предлагаю чуть более оптимизированную версию кода, которая работает чуть побыстрее — может, кому пригодится 🙂

  1. #Programm for resize pictures here: https://lavrynenko.com/wp-content/uploads/2019/01/magick.exe
  2. import ftplib
  3. import os
  4. import sys
  5. import subprocess
  6. import time
  7. from termcolor import colored
  8.  
  9. def autorization():
  10.     host = str(input('Host?: ')) #FTP
  11.     ftp_user = str(input('User?: ')) #Login
  12.     ftp_password = str(input('Password?: ')) #Password
  13.  
  14.     #После чего каждую переменную подключим к авторизации:
  15.     print('Попытка соединения с FTP-сервером', host)
  16.     print('Login:', ftp_user)
  17.     print('Password:', ftp_password)
  18.  
  19.     ftp = ftplib.FTP(host, ftp_user, ftp_password)
  20.     welcome_text = ftp.getwelcome()
  21.     print(welcome_text, '\n')  # Вывели на экран Welcome-сообщение сервера
  22.     directory_list = ftp.nlst()  # загоняем в переменную list список содержимого директории
  23.     directory_listing = []
  24.     catalog_or(ftp)
  25.  
  26. def catalog_or(ftp):
  27.     print('Создаем список каталогов: \n')
  28.     data = []
  29.     ftp.dir(data.append)
  30.     data.sort()
  31.     for line in data:
  32.         if line[0] == str('d'):
  33.             print(line)
  34.         else:
  35.             None
  36.     menu(ftp)
  37.  
  38. def menu(ftp):
  39.     menu_directory = int(input('\n 1 - Выбрать каталог для работы\n 2 - Выйти вверх\n 3 - Работать в текущем каталоге\n >>> '))
  40.     if menu_directory == 1:
  41.         down(ftp)
  42.     elif menu_directory == 2:
  43.         up(ftp)
  44.     elif menu_directory == 3:
  45.         work(ftp)
  46.  
  47. def up(ftp):
  48.     print('Выходим вверх')
  49.     ftp.sendcmd('cdup')
  50.     #menu(ftp, directory_listening)
  51.     catalog_or(ftp)
  52.  
  53. def down(ftp):
  54.     work_directory = str(input('Введите название каталога\n >>> '))
  55.     print('Входим в каталог:', work_directory)
  56.     ftp.cwd(work_directory)
  57.     catalog_or(ftp)
  58.  
  59. def work(ftp):
  60.     print('Работаем!')
  61.     print('sys.argv[0] =', sys.argv[0])
  62.     pathname = os.path.dirname(sys.argv[0])
  63.     print('Скрипт находится:', pathname)
  64.     print('Полный путь к скрипту:', os.path.abspath(pathname))
  65.  
  66.     data = []
  67.     ftp.dir(data.append)
  68.     data.sort()
  69.     print('В каталоге имеется:')
  70.     directory_list = ftp.nlst()  # загоняем в переменную list полный список содержимого директории
  71.     print('Структура информации на сервере:\n', directory_list)
  72.  
  73.     file_list = [] #список только файлов
  74.     directory_listing = [] #список только каталогов
  75.     for director in directory_list:
  76.         try:
  77.             ftp.cwd(director)
  78.             directory_listing.append(director)
  79.             ftp.sendcmd('cdup')
  80.         except:
  81.             ftplib.error_perm: 550
  82.     print('Каталоги:', directory_listing)
  83.     file_list = list(set(directory_list) - set(directory_listing))
  84.     print('Только файлы:', file_list, '\n')
  85.     optimization_size = int(0)
  86.  
  87.     for file in file_list:
  88.         file_extention = file.split('.')[-1]
  89.  
  90.         if file_extention == 'jpg':
  91.             print('Файл:\n', file, colored('расширение: jpg', 'green'))
  92.             print(colored('Загружаем файл', 'yellow'))
  93.             with open(file, 'wb') as local_file:
  94.                 ftp.retrbinary('retr ' + file, local_file.write)
  95.                 print(file, colored('успешно загружен с FTP', 'green'))
  96.  
  97.             orig_file = 'orig_' + file
  98.             os.rename(file, orig_file)
  99.             subprocess.run('{} {} {} {} {}'.format('magick.exe', orig_file, '-quality', '50', file))
  100.             print(file, colored('успешно обработан', 'green'))
  101.  
  102.             with open(file, 'rb') as file_to_upload:
  103.                 ftp.storbinary('stor ' + file, file_to_upload)
  104.                 print(file, colored('успешно загружен на FTP', 'green'))
  105.  
  106.             with open(orig_file, 'rb') as file_to_upload:
  107.                 ftp.storbinary('stor ' + orig_file, file_to_upload)
  108.                 print(orig_file, colored('успешно загружен на FTP', 'green'))
  109.  
  110.             file_size = os.path.getsize(file)
  111.             orig_file_size = os.path.getsize(orig_file)
  112.             print('\n Файл', file, 'занимал', orig_file_size, 'kb, а теперь занимает', file_size, 'kb.')
  113.             optimization_size = optimization_size + (orig_file_size - file_size)
  114.             os.remove(orig_file)
  115.             print(orig_file, colored('удален из локального хранилища', 'yellow'))
  116.             os.remove(file)
  117.             print(file, colored('удален из локального хранилища', 'yellow'))
  118.             print('Обработка файла завершена.')
  119.             print('   ')
  120.  
  121.         elif file_extention == 'png':
  122.             print('Файл:\n', file, colored('расширение: png', 'green'))
  123.             print(colored('Загружаем файл', 'yellow'))
  124.             with open(file, 'wb') as local_file:
  125.                 ftp.retrbinary('retr ' + file, local_file.write)
  126.                 print(file, colored('успешно загружен с FTP', 'green'))
  127.  
  128.             orig_file = 'orig_' + file
  129.             os.rename(file, orig_file)
  130.             subprocess.run('{} {} {} {} {}'.format('magick.exe', orig_file, '-quality', '91', file))
  131.             print(file, colored('успешно обработан', 'green'))
  132.  
  133.             with open(file, 'rb') as file_to_upload:
  134.                 ftp.storbinary('stor ' + file, file_to_upload)
  135.                 print(file, colored('успешно загружен на FTP', 'green'))
  136.  
  137.             with open(orig_file, 'rb') as file_to_upload:
  138.                 ftp.storbinary('stor ' + orig_file, file_to_upload)
  139.                 print(orig_file, colored('успешно загружен на FTP', 'green'))
  140.  
  141.             file_size = os.path.getsize(file)
  142.             orig_file_size = os.path.getsize(orig_file)
  143.             print('\n Файл', file, 'занимал', orig_file_size, 'kb, а теперь занимает', file_size, 'kb.')
  144.             optimization_size = optimization_size + (orig_file_size - file_size)
  145.             print(' Экономим:', orig_file_size - file_size, 'kb\n')
  146.  
  147.             os.remove(orig_file)
  148.             print(orig_file, colored('удален из локального хранилища', 'yellow'))
  149.             os.remove(file)
  150.             print(file, colored('удален из локального хранилища', 'yellow'))
  151.             print('Обработка файла завершена.')
  152.             print('   ')
  153.  
  154.         elif file_extention != 'png' or 'jpg':
  155.             print(file,'\n')
  156.             print(file, colored(' - другое расширение', 'red'))
  157.             print('   ')
  158.  
  159.     print(colored('Итого сжали:'))
  160.     print(optimization_size, 'kB')
  161.     print('\033[92m' + 'Все сделано!')
  162.  
  163. def index():
  164.     autorization()
  165.  
  166. index()

От предыдущей версии код работает быстрее, имеет выдачу статистики в конце, ну и визуально вроде более наглядный… 🙂

И да, код доступен на Git.
И конечно — в случае возникновения вопросов пишите на почту, или в Телеграм 😉