Привет всем! Интересный вопрос тут пришел в Telegram недавно: «Как скачать из папок на FTP только последние файлы?»:
Хорошо, что человек оставил свои контактные данные. Списались, обсудили задачу, которая в общих чертах выглядит так:
1. Есть FTP-сервер, на который иногда (либо раз в день, либо раз в неделю — это уж как повезет) главный офис заливает файлы. Причем — файлы разбрасываются в момент заливки по фиксированным папкам (их аж 140 штук).
2. Задача: сделать что-то, что будет забирать с FTP-сервера только новые файлы, не затрагивая старые.
Изначально человек, задавший вопрос предполагал идти через формирование списка файлов по времени изменения. Но возникали вопросы — а как контролировать? Что считать точкой отсчета? В итоге было принято решение разбить код на две части:
- 1. — Код, отвечающий за формирование исходного списка файлов — эдакого своеобразного слепка
- 2. — Код, который будет сравнивать текущее состояние FTP со списком, который сделан с помощью первого кода
На практике это выглядит следующим образом:
Код 1:
#Программа для создания исходного списка файлов
import ftplib
import time
from datetime import datetime
#Соединяемся с FTP-сервером
host = str(input('Host?: ')) #Например - ftp.cse.buffalo.edu
ftp_user = str(input('User?: ')) #anonymous
ftp_password = str(input('Password?: ')) #Тут вводим пароль
#после чего каждую переменную подключим к авторизации:
ftp = ftplib.FTP(host, ftp_user, ftp_password)
welcome_text = ftp.getwelcome()
print(welcome_text) #Вывели на экран Welcome-сообщение сервера
#Проверяем текущее состояние папок
directory_list = ftp.nlst() #загоняем в переменную list список содержимого директории
#print(directory_list) #Вывели список папок на сервере
print('Общее количество папок на сервере: ', len(directory_list))
#Получаем список файлов в каталоге
for directory in directory_list:
ftp.cwd(directory) #Входим в папку
sub_directory_list = ftp.nlst() #Получаем список файлов в папке
print('В папке', directory, 'находятся следующие файлы: \n', sub_directory_list)
for sub_directory_file in sub_directory_list:
file_redaction = ftp.sendcmd('mdtm ' + sub_directory_file) #Получаем время последней редакции каждого файла в папке
file_exp = '.txt'
directory = str(directory)
file_for_write = directory + file_exp
with open(file_for_write, 'a', encoding='utf8') as f: #Создаем файл с именем папки, и записываем в созданный файл все файлы, имеющиеся в папке в настоящий момент
f.write(sub_directory_file + '\n')
ftp.sendcmd('cdup') #Выходим из текущей папки
print('Оригинальный список файлов создан... \n')
Код 2:
#Программа для получения обновлений с FTP-сервера
import ftplib
import time
from datetime import datetime
import os
#Соединяемся с FTP-сервером
host = str(input('Host?: ')) #ftp.cse.buffalo.edu
ftp_user = str(input('User?: ')) #anonymous
ftp_password = str(input('Password?: ')) #Указываем пароль для входа
#после чего каждую переменную подключим к авторизации:
ftp = ftplib.FTP(host, ftp_user, ftp_password)
welcome_text = ftp.getwelcome()
print(welcome_text) #Вывели на экран Welcome-сообщение сервера
directory_list = ftp.nlst() #загоняем в переменную list названия всех папок
#Создаем список файлов из исходного
for directory in directory_list:
file_exp = '.txt'
directory = str(directory)
directory_file = directory + '.txt' #формируем имя файла, который будем открывать: название папки + расширение
with open(directory_file) as f:
list_iso = [row.strip() for row in f]
print('Список файлов в папке', directory, ':', list_iso)
#Создаем список файлов с сервера
ftp.cwd(directory) #Входим в папку
sub_directory_list = ftp.nlst()
print('Список файлов в папке', directory, 'на сервере:', sub_directory_list)
new_files = set(list_iso) ^ set(sub_directory_list)
new_files = list(new_files)
print('В папке', directory,'добавлены файлы:', new_files)
if len(new_files) > 0:
print('Изменения есть')
directory_for_save_temp = directory
try:
os.mkdir(directory)
except OSError:
print("Создать директорию %s не удалось" % directory)
else:
print("Успешно создана директория %s " % directory)
for new_file in new_files:
with open(directory + '/' + new_file, 'wb') as local_file:
ftp.retrbinary('retr ' + new_file, local_file.write)
elif len(new_files) == 0:
print('Изменений с прошлой проверки нет')
ftp.sendcmd('cdup') #Выходим из текущей папки
Вроде как все 🙂
В случае возникновения вопросов — пожалуйста, пишите на почту или в Телеграм 😉
Support the Blog!
Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️