Python: как скачать из папок на FTP только последние файлы?

Привет всем! Интересный вопрос тут пришел в Telegram недавно: «Как скачать из папок на FTP только последние файлы?»:
Как скачать из папок на FTP только последние файлы
Хорошо, что человек оставил свои контактные данные. Списались, обсудили задачу, которая в общих чертах выглядит так:
1. Есть FTP-сервер, на который иногда (либо раз в день, либо раз в неделю — это уж как повезет) главный офис заливает файлы. Причем — файлы разбрасываются в момент заливки по фиксированным папкам (их аж 140 штук).
2. Задача: сделать что-то, что будет забирать с FTP-сервера только новые файлы, не затрагивая старые.

Изначально человек, задавший вопрос предполагал идти через формирование списка файлов по времени изменения. Но возникали вопросы — а как контролировать? Что считать точкой отсчета? В итоге было принято решение разбить код на две части:

  • 1. — Код, отвечающий за формирование исходного списка файлов — эдакого своеобразного слепка
  • 2. — Код, который будет сравнивать текущее состояние FTP со списком, который сделан с помощью первого кода

На практике это выглядит следующим образом:
Код 1:

  1. #Программа для создания исходного списка файлов
  2. import ftplib
  3. import time
  4. from datetime import datetime
  5.  
  6. #Соединяемся с FTP-сервером
  7. host = str(input('Host?: ')) #Например - ftp.cse.buffalo.edu
  8. ftp_user = str(input('User?: ')) #anonymous
  9. ftp_password = str(input('Password?: ')) #Тут вводим пароль
  10. #после чего каждую переменную подключим к авторизации:
  11. ftp = ftplib.FTP(host, ftp_user, ftp_password)
  12. welcome_text = ftp.getwelcome()
  13. print(welcome_text) #Вывели на экран Welcome-сообщение сервера
  14.  
  15. #Проверяем текущее состояние папок
  16. directory_list = ftp.nlst() #загоняем в переменную list список содержимого директории
  17. #print(directory_list) #Вывели список папок на сервере
  18. print('Общее количество папок на сервере: ', len(directory_list))
  19.  
  20. #Получаем список файлов в каталоге
  21. for directory in directory_list:
  22.     ftp.cwd(directory) #Входим в папку
  23.     sub_directory_list = ftp.nlst() #Получаем список файлов в папке
  24.     print('В папке', directory, 'находятся следующие файлы: \n', sub_directory_list)
  25.     for sub_directory_file in sub_directory_list:
  26.         file_redaction = ftp.sendcmd('mdtm ' + sub_directory_file) #Получаем время последней редакции каждого файла в папке
  27.         file_exp = '.txt'
  28.         directory = str(directory)
  29.         file_for_write = directory + file_exp
  30.         with open(file_for_write, 'a', encoding='utf8') as f: #Создаем файл с именем папки, и записываем в созданный файл все файлы, имеющиеся в папке в настоящий момент
  31.             f.write(sub_directory_file + '\n')
  32.     ftp.sendcmd('cdup') #Выходим из текущей папки
  33. print('Оригинальный список файлов создан... \n')

Код 2:

  1. #Программа для получения обновлений с FTP-сервера
  2. import ftplib
  3. import time
  4. from datetime import datetime
  5. import os
  6.  
  7. #Соединяемся с FTP-сервером
  8. host = str(input('Host?: ')) #ftp.cse.buffalo.edu
  9. ftp_user = str(input('User?: ')) #anonymous
  10. ftp_password = str(input('Password?: ')) #Указываем пароль для входа
  11.  
  12. #после чего каждую переменную подключим к авторизации:
  13. ftp = ftplib.FTP(host, ftp_user, ftp_password)
  14. welcome_text = ftp.getwelcome()
  15. print(welcome_text) #Вывели на экран Welcome-сообщение сервера
  16.  
  17. directory_list = ftp.nlst() #загоняем в переменную list названия всех папок
  18.  
  19. #Создаем список файлов из исходного
  20. for directory in directory_list:
  21.     file_exp = '.txt'
  22.     directory = str(directory)
  23.     directory_file = directory + '.txt' #формируем имя файла, который будем открывать: название папки + расширение
  24.  
  25.     with open(directory_file) as f:
  26.         list_iso = [row.strip() for row in f]
  27.  
  28.     print('Список файлов в папке', directory, ':', list_iso)
  29.     #Создаем список файлов с сервера
  30.     ftp.cwd(directory) #Входим в папку
  31.     sub_directory_list = ftp.nlst()
  32.     print('Список файлов в папке', directory, 'на сервере:', sub_directory_list)
  33.     new_files = set(list_iso) ^ set(sub_directory_list)
  34.     new_files = list(new_files)
  35.     print('В папке', directory,'добавлены файлы:', new_files)
  36.  
  37.     if len(new_files) > 0:
  38.         print('Изменения есть')
  39.         directory_for_save_temp = directory
  40.         try:
  41.             os.mkdir(directory)
  42.         except OSError:
  43.             print("Создать директорию %s не удалось" % directory)
  44.         else:
  45.             print("Успешно создана директория %s " % directory)
  46.         for new_file in new_files:
  47.             with open(directory + '/' + new_file, 'wb') as local_file:
  48.                 ftp.retrbinary('retr ' + new_file, local_file.write)
  49.     elif len(new_files) == 0:
  50.         print('Изменений с прошлой проверки нет')
  51.     ftp.sendcmd('cdup') #Выходим из текущей папки

Вроде как все 🙂
В случае возникновения вопросов — пожалуйста, пишите на почту или в Телеграм 😉