FTP в Python: как управлять файлами через протокол передачи

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Python-разработчики, желающие изучить работу с FTP-протоколом
  • Специалисты по DevOps и сетевому администрированию, нуждающиеся в автоматизации задач
  • Студенты и начинающие программисты, интересующиеся сетевым программированием и передачей данных

    FTP-протокол остаётся незаменимым инструментом для передачи файлов между серверами, несмотря на появление более современных решений. Написать надёжный код для работы с FTP может стать настоящей головной болью даже для опытных разработчиков — из-за особенностей протокола, многочисленных параметров соединения и потенциальных ошибок. В этой статье мы разберём, как Python с его элегантным модулем ftplib превращает сложную задачу в несколько простых строк кода. 🚀 Вы узнаете, как подключаться к серверам, перемещаться по директориям и организовать безопасную передачу файлов — с рабочими примерами для каждого шага.

Хотите стать мастером сетевых протоколов на Python? На курсе Обучение Python-разработке от Skypro вы научитесь не только работать с FTP, но и создавать полноценные веб-приложения. Под руководством опытных преподавателей вы с первых недель будете писать рабочий код и получите портфолио из реальных проектов. Выпускники курса без проблем находят работу в IT-компаниях благодаря практическому подходу и современной программе.

Python и FTP: основы протокола и встроенный ftplib

FTP (File Transfer Protocol) — один из старейших протоколов передачи данных, который продолжает широко использоваться для обмена файлами между компьютерами в сети. Python предлагает встроенный модуль ftplib, который делает работу с этим протоколом максимально простой и эффективной. 📂

Прежде чем мы углубимся в программирование, давайте разберём основные особенности протокола FTP:

  • Работает по модели клиент-сервер
  • Поддерживает два режима передачи: ASCII (для текстовых файлов) и Binary (для бинарных данных)
  • Использует два параллельных канала: командный канал (порт 21) и канал данных (порт 20 или динамический порт в пассивном режиме)
  • Предлагает два режима работы: активный и пассивный

Модуль ftplib абстрагирует большинство этих сложностей, предоставляя простой интерфейс для взаимодействия с FTP-серверами. Вот базовая структура класса FTP, который мы будем использовать:

Метод Описание Пример использования
connect(host, port) Подключение к серверу ftp.connect('ftp.example.com', 21)
login(user, passwd) Авторизация на сервере ftp.login('user', 'password')
cwd(dirname) Смена директории ftp.cwd('/public')
retrlines(cmd) Получение текстовых данных ftp.retrlines('LIST')
retrbinary(cmd, callback) Получение бинарных данных ftp.retrbinary('RETR file.zip', open('file.zip', 'wb').write)

Давайте посмотрим на простейший пример подключения к FTP-серверу:

Python
Скопировать код
from ftplib import FTP

# Создаём экземпляр FTP-клиента
ftp = FTP()

# Подключаемся к серверу
ftp.connect('ftp.example.com', 21)

# Проверяем ответ сервера
welcome = ftp.getwelcome()
print(f"Сервер приветствует нас: {welcome}")

# Закрываем соединение
ftp.quit()

Этот код устанавливает соединение с FTP-сервером, получает приветственное сообщение и корректно закрывает соединение. Обратите внимание, что здесь мы не выполняем аутентификацию — это будет следующим шагом в нашем руководстве.

Александр Иванов, DevOps-инженер

Однажды мне пришлось решать задачу по автоматизации резервного копирования базы данных с последующей отправкой архивов на удалённый FTP-сервер. До этого у нас был скрипт на Bash, который часто ломался из-за проблем с соединением. Переписав решение на Python с использованием ftplib, я смог добавить надёжную обработку ошибок и повторные попытки отправки.

Ключевым моментом стала реализация пассивного режима FTP, который решил проблемы с файрволом. Код был примерно таким:

Python
Скопировать код
ftp = FTP()
ftp.set_pasv(True) # Включение пассивного режима
try:
ftp.connect(server, port)
ftp.login(user, password)
with open(backup_file, 'rb') as f:
ftp.storbinary(f'STOR {backup_name}', f)
except Exception as e:
send_alert(f"Backup failed: {e}")
retry_later()
finally:
ftp.quit()

После этого обновления наши бэкапы стали отправляться без сбоев, что существенно повысило надёжность всей инфраструктуры.

Пошаговый план для смены профессии

Настройка FTP-подключения с аутентификацией в Python

Большинство FTP-серверов требуют аутентификации для доступа к данным. Python предоставляет простой и элегантный способ авторизации с использованием метода login() объекта FTP. Рассмотрим, как правильно настроить защищенное подключение к FTP-серверу. 🔐

Вот базовый пример аутентификации:

Python
Скопировать код
from ftplib import FTP

# Создаём экземпляр FTP-клиента
ftp = FTP()

# Подключаемся к серверу
ftp.connect('ftp.example.com', 21)

# Авторизуемся
ftp.login(user='username', passwd='password')

# Проверяем текущую директорию
current_dir = ftp.pwd()
print(f"Текущая директория: {current_dir}")

# Закрываем соединение
ftp.quit()

Если вам нужен анонимный доступ (что часто используется для публичных FTP-серверов), вы можете использовать:

Python
Скопировать код
# Анонимное подключение
ftp.login() # По умолчанию использует anonymous/anonymous@

При разработке приложений, работающих с FTP, важно обрабатывать возможные исключения и обеспечивать корректное закрытие соединения. Вот пример с обработкой исключений:

Python
Скопировать код
from ftplib import FTP, error_perm

try:
ftp = FTP()
ftp.connect('ftp.example.com', 21)
try:
ftp.login('username', 'password')
print("Успешная авторизация!")
# Выполнение FTP-операций...
except error_perm as e:
if str(e).startswith('530'):
print("Ошибка авторизации: неверные учетные данные")
else:
print(f"Ошибка при авторизации: {e}")
except Exception as e:
print(f"Ошибка при подключении: {e}")
finally:
# Попытка закрыть соединение, если оно было установлено
if 'ftp' in locals() and ftp.sock is not None:
ftp.quit()

Для безопасной передачи данных рекомендуется использовать FTPS (FTP через SSL/TLS). Python предоставляет класс FTP_TLS для работы с защищенными соединениями:

Python
Скопировать код
from ftplib import FTP_TLS

# Создаём экземпляр защищенного FTP-клиента
ftps = FTP_TLS()
ftps.connect('ftps.example.com', 21)
ftps.login('username', 'password')

# Явное включение защиты данных
ftps.prot_p()

# Выполнение операций...

ftps.quit()

При работе с FTP-подключениями важно правильно выбрать параметры в зависимости от конкретной задачи. Вот сравнительная таблица различных типов подключений:

Параметр FTP (обычный) FTP с пассивным режимом FTPS (защищенный)
Защита данных Нет (открытый текст) Нет (открытый текст) Да (шифрование SSL/TLS)
Работа через файрволы Проблематично Хорошо Хорошо (в пассивном режиме)
Порт по умолчанию 21 21 (командный) 21 (как правило)
Класс в Python FTP FTP с set_pasv(True) FTP_TLS

Для создания устойчивых FTP-подключений рекомендуется следовать этим советам:

  • Всегда закрывайте соединение после использования через quit() или контекстный менеджер
  • Используйте таймауты для предотвращения зависания программы при проблемах с сетью
  • Включайте пассивный режим при работе через NAT или файрвол
  • По возможности используйте FTPS вместо обычного FTP для защиты передаваемых данных
  • Храните учетные данные в защищенном месте (переменных окружения или конфигурационных файлах с ограниченным доступом)

Навигация по FTP-серверу и работа с файловой структурой

После успешного подключения к FTP-серверу следующим шагом является навигация по его файловой структуре. Модуль ftplib предоставляет набор методов, которые позволяют перемещаться по директориям, получать списки файлов и выполнять другие операции с файловой системой. 🧭

Рассмотрим основные команды для навигации по FTP-серверу:

Python
Скопировать код
from ftplib import FTP

# Подключаемся к серверу
ftp = FTP('ftp.example.com')
ftp.login('username', 'password')

# Получаем текущую директорию
current_dir = ftp.pwd()
print(f"Текущая директория: {current_dir}")

# Получаем список файлов в текущей директории
files = ftp.nlst()
print(f"Файлы в текущей директории: {files}")

# Переходим в другую директорию
ftp.cwd('/public/docs')
print(f"Новая текущая директория: {ftp.pwd()}")

# Возвращаемся в родительскую директорию
ftp.cwd('..')
print(f"После перехода вверх: {ftp.pwd()}")

ftp.quit()

Для получения более подробной информации о файлах и директориях можно использовать метод retrlines('LIST'), который возвращает расширенные сведения в формате, похожем на вывод команды ls -l в Unix:

Python
Скопировать код
# Получаем детальный список файлов с их атрибутами
print("Детальный список файлов:")
ftp.retrlines('LIST')

Можно также программно обрабатывать результаты, собирая вывод в список:

Python
Скопировать код
# Получаем и обрабатываем детальный список
file_info = []
ftp.retrlines('LIST', file_info.append)

for item in file_info:
# Парсинг строки вывода LIST
parts = item.split(None, 8)
if len(parts) >= 9:
permissions, _, owner, group, size, month, day, time_or_year, name = parts
is_directory = permissions.startswith('d')
print(f"{'Директория' if is_directory else 'Файл'}: {name}, Размер: {size} байт")

Для работы с директориями FTP предоставляет набор полезных методов:

  • mkd(dirname) — создание новой директории
  • rmd(dirname) — удаление директории
  • size(filename) — получение размера файла
  • rename(fromname, toname) — переименование файла или директории
  • delete(filename) — удаление файла

Вот пример, демонстрирующий эти операции:

Python
Скопировать код
# Создаём новую директорию
try:
ftp.mkd('new_folder')
print("Директория успешно создана")
except:
print("Директория уже существует или нет прав на создание")

# Переходим в созданную директорию
ftp.cwd('new_folder')

# Возвращаемся и переименовываем директорию
ftp.cwd('..')
ftp.rename('new_folder', 'renamed_folder')
print("Директория переименована")

# Удаляем директорию
ftp.rmd('renamed_folder')
print("Директория удалена")

Для эффективной работы с FTP-серверами полезно знать некоторые особенности и ограничения:

Михаил Петров, Python-разработчик

В одном из проектов мне нужно было написать скрипт для синхронизации локальной директории с FTP-сервером. Ключевой проблемой стало обнаружение различий между локальными и удалёнными файлами для минимизации передаваемого трафика.

Я создал функцию для рекурсивного обхода директорий FTP-сервера:

Python
Скопировать код
def list_ftp_dir(ftp, path):
files = []
dirs = []

try:
ftp.cwd(path)
items = []
ftp.retrlines('LIST', items.append)

for item in items:
parts = item.split(None, 8)
if len(parts) < 9:
continue

name = parts[8]
if name in ('.', '..'):
continue

if parts[0].startswith('d'):
dirs.append(name)
else:
size = int(parts[4])
files.append((name, size))

for subdir in dirs:
subpath = path + '/' + subdir if path != '/' else '/' + subdir
subfiles = list_ftp_dir(ftp, subpath)
for file_info in subfiles:
name, size = file_info
files.append((subdir + '/' + name, size))

if path != '/':
ftp.cwd('..')
except Exception as e:
print(f"Ошибка при обходе {path}: {e}")

return files

Этот код позволил составить полную карту файлов на сервере с их размерами, которую затем можно было сравнить с локальной структурой. В результате наш скрипт стал загружать только изменённые файлы, что уменьшило трафик на 80%.

Загрузка и скачивание файлов через Python FTP-интерфейс

Основная цель использования FTP — это передача файлов, и Python предоставляет удобные методы как для загрузки файлов на сервер, так и для их скачивания. Правильная обработка бинарных и текстовых файлов является ключом к успешной работе с FTP. 📤📥

Начнем с процесса загрузки файлов на FTP-сервер. Для этого используется метод storbinary() для бинарных файлов и storlines() для текстовых:

Python
Скопировать код
from ftplib import FTP

# Подключаемся к серверу
ftp = FTP('ftp.example.com')
ftp.login('username', 'password')

# Загрузка бинарного файла (например, изображения)
with open('image.png', 'rb') as file:
ftp.storbinary(f'STOR image.png', file)
print("Изображение успешно загружено")

# Загрузка текстового файла
with open('data.txt', 'rb') as file: # Открываем в бинарном режиме даже для текста
ftp.storbinary(f'STOR data.txt', file)
print("Текстовый файл успешно загружен")

ftp.quit()

Обратите внимание, что даже для текстовых файлов мы используем storbinary() и открываем файл в бинарном режиме ('rb'). Это позволяет избежать проблем с различиями в представлении символов новой строки между разными операционными системами.

Теперь рассмотрим процесс скачивания файлов с FTP-сервера:

Python
Скопировать код
# Скачивание бинарного файла
with open('downloaded_image.png', 'wb') as file:
ftp.retrbinary(f'RETR image.png', file.write)
print("Изображение успешно скачано")

# Скачивание текстового файла
with open('downloaded_data.txt', 'wb') as file: # Также используем бинарный режим
ftp.retrbinary(f'RETR data.txt', file.write)
print("Текстовый файл успешно скачан")

При работе с большими файлами полезно отслеживать прогресс передачи. Можно реализовать это с помощью колбэк-функции:

Python
Скопировать код
def download_with_progress(ftp, remote_file, local_file):
file_size = ftp.size(remote_file)
downloaded = 0

# Функция-обработчик для отслеживания прогресса
def callback(data):
nonlocal downloaded
downloaded += len(data)
progress = (downloaded / file_size) * 100
print(f"\rПрогресс загрузки: {progress:.2f}%", end='')
local_file.write(data)

print(f"Начинаю загрузку файла {remote_file} размером {file_size} байт")
ftp.retrbinary(f"RETR {remote_file}", callback)
print("\nЗагрузка завершена!")

# Использование функции для скачивания с отслеживанием прогресса
with open('large_file.zip', 'wb') as file:
download_with_progress(ftp, 'large_file.zip', file)

При передаче файлов через FTP важно учитывать различные аспекты, которые могут повлиять на процесс. Вот сравнительная таблица методов загрузки и скачивания файлов:

Операция Метод Режим файла Преимущества Ограничения
Загрузка бинарных файлов storbinary() 'rb' Сохраняет данные без изменений Требует больше памяти для больших файлов
Загрузка текстовых файлов storlines() 'r' Автоматическая обработка новых строк Может некорректно обрабатывать бинарные данные
Скачивание бинарных файлов retrbinary() 'wb' Точная копия оригинала Требует правильного указания режима передачи
Скачивание текстовых файлов retrlines() 'w' Обрабатывает текстовые строки Может изменить форматы новых строк

Для повышения надежности передачи файлов, особенно при работе с нестабильным соединением, рекомендуется реализовать механизм повторных попыток:

Python
Скопировать код
import time
from ftplib import FTP, error_temp

def upload_with_retry(ftp, local_file, remote_name, max_attempts=3):
attempts = 0
while attempts < max_attempts:
try:
with open(local_file, 'rb') as file:
ftp.storbinary(f'STOR {remote_name}', file)
print(f"Файл {local_file} успешно загружен как {remote_name}")
return True
except error_temp as e:
attempts += 1
wait_time = 2 ** attempts # Экспоненциальная выдержка
print(f"Временная ошибка: {e}. Повторная попытка через {wait_time} сек...")
time.sleep(wait_time)

print(f"Не удалось загрузить файл после {max_attempts} попыток")
return False

# Использование функции
upload_with_retry(ftp, 'important_data.csv', 'data.csv')

Также важно учитывать ограничения безопасности при работе с FTP. Рекомендуется использовать FTPS для защиты передаваемых данных, особенно если они содержат конфиденциальную информацию:

Python
Скопировать код
from ftplib import FTP_TLS

# Создаем защищенное соединение
ftps = FTP_TLS()
ftps.connect('ftps.example.com', 21)
ftps.login('username', 'password')
ftps.prot_p() # Включаем защиту данных

# Теперь загрузка и скачивание будут происходить по защищенному каналу
with open('confidential.pdf', 'rb') as file:
ftps.storbinary(f'STOR confidential.pdf', file)

ftps.quit()

Автоматизация FTP-задач: практические скрипты и решения

Автоматизация работы с FTP — это то, что действительно раскрывает потенциал Python для решения реальных задач. От планового резервного копирования до сложных систем синхронизации — всё это можно реализовать с помощью элегантных Python-скриптов. 🤖

Рассмотрим несколько практических примеров автоматизации FTP-задач:

1. Периодическое резервное копирование

Python
Скопировать код
import os
import time
import schedule
from datetime import datetime
from ftplib import FTP

def backup_to_ftp():
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_filename = f"backup_{timestamp}.zip"

# Здесь код для создания архива (используйте модуль zipfile или subprocess)
# ...

# Загрузка архива на FTP
try:
ftp = FTP('ftp.example.com')
ftp.login('backup_user', 'password')

# Проверка и создание директории для текущего месяца
current_month = datetime.now().strftime("%Y-%m")
try:
ftp.mkd(current_month)
except:
pass # Директория уже существует

ftp.cwd(current_month)

with open(backup_filename, 'rb') as file:
ftp.storbinary(f'STOR {backup_filename}', file)

# Удаление старых резервных копий (оставляем только последние 5)
ftp.cwd('/')
for month_dir in ftp.nlst():
if not month_dir.startswith('20'): # Пропускаем нерелевантные директории
continue

ftp.cwd(month_dir)
backup_files = sorted([f for f in ftp.nlst() if f.startswith('backup_')])

# Удаляем старые файлы, оставляя последние 5
for old_file in backup_files[:-5]:
try:
ftp.delete(old_file)
print(f"Удален устаревший файл: {month_dir}/{old_file}")
except:
print(f"Не удалось удалить файл: {month_dir}/{old_file}")

ftp.cwd('/')

ftp.quit()

# Удаляем локальный файл бэкапа после успешной загрузки
os.remove(backup_filename)
print(f"Резервное копирование выполнено успешно: {backup_filename}")
except Exception as e:
print(f"Ошибка при выполнении резервного копирования: {e}")

# Планируем выполнение каждый день в 3 часа ночи
schedule.every().day.at("03:00").do(backup_to_ftp)

# Запускаем цикл планировщика
while True:
schedule.run_pending()
time.sleep(60)

2. Синхронизация локальной и удаленной директорий

Python
Скопировать код
import os
from ftplib import FTP

def sync_directories(local_dir, remote_dir, ftp):
"""Синхронизирует локальную директорию с удаленной на FTP-сервере"""

# Создаем удаленную директорию, если она не существует
try:
ftp.cwd(remote_dir)
except:
parent_dir = os.path.dirname(remote_dir)
dir_name = os.path.basename(remote_dir)

if parent_dir:
ftp.cwd(parent_dir)

ftp.mkd(dir_name)
ftp.cwd(dir_name)

# Получаем списки файлов
local_files = os.listdir(local_dir)
remote_files = ftp.nlst()

# Загружаем новые или измененные файлы
for local_file in local_files:
local_path = os.path.join(local_dir, local_file)

# Если это директория, рекурсивно обрабатываем ее
if os.path.isdir(local_path):
new_remote_dir = os.path.join(remote_dir, local_file).replace('\\', '/')
sync_directories(local_path, new_remote_dir, ftp)
else:
# Проверяем, существует ли файл на сервере и отличается ли по размеру
local_size = os.path.getsize(local_path)

if local_file in remote_files:
try:
remote_size = ftp.size(local_file)
if remote_size == local_size:
print(f"Пропуск существующего файла: {local_file}")
continue
except:
pass # Файл не существует или не получилось определить размер

# Загружаем файл
print(f"Загрузка файла: {local_file}")
with open(local_path, 'rb') as f:
ftp.storbinary(f'STOR {local_file}', f)

# Возвращаемся в родительскую директорию
if remote_dir != '/':
ftp.cwd('..')

# Использование функции
try:
ftp = FTP('ftp.example.com')
ftp.login('username', 'password')

sync_directories('./local_website', '/public_html', ftp)

ftp.quit()
print("Синхронизация успешно завершена")
except Exception as e:
print(f"Ошибка при синхронизации: {e}")

Работа с FTP часто включает в себя мониторинг и проверку состояния файлов. Вот пример скрипта, который отслеживает появление новых файлов в указанной директории на FTP-сервере и выполняет их обработку:

Python
Скопировать код
import time
from ftplib import FTP

def process_file(filename):
"""Обрабатывает скачанный файл (пример)"""
print(f"Обработка файла: {filename}")
# Здесь код для обработки файла
# ...

def monitor_ftp_directory():
ftp = FTP('ftp.example.com')
ftp.login('username', 'password')
ftp.cwd('/incoming')

processed_files = set() # Множество уже обработанных файлов

while True:
try:
current_files = set(ftp.nlst())
new_files = current_files – processed_files

for filename in new_files:
print(f"Обнаружен новый файл: {filename}")

# Скачиваем файл
with open(filename, 'wb') as f:
ftp.retrbinary(f'RETR {filename}', f.write)

# Обрабатываем файл
process_file(filename)

# Перемещаем файл в архивную директорию на сервере
try:
ftp.rename(filename, f'/processed/{filename}')
except:
# Возможно, директория не существует, создаем ее
try:
ftp.mkd('/processed')
ftp.rename(filename, f'/processed/{filename}')
except Exception as e:
print(f"Ошибка при перемещении файла в архив: {e}")

# Добавляем в список обработанных
processed_files.add(filename)

# Пауза перед следующей проверкой
time.sleep(60)

# Обновляем подключение, чтобы избежать тайм-аута
ftp.voidcmd('NOOP')

except Exception as e:
print(f"Ошибка при мониторинге: {e}")

# Повторное подключение в случае ошибки
try:
ftp.quit()
except:
pass

time.sleep(30) # Пауза перед повторным подключением

ftp = FTP('ftp.example.com')
ftp.login('username', 'password')
ftp.cwd('/incoming')

# Запуск мониторинга
monitor_ftp_directory()

Когда требуется более надежное и гибкое решение, можно объединить работу с FTP и логирование, создавая полноценную систему автоматизации:

Python
Скопировать код
import logging
import os
from ftplib import FTP, all_errors
from datetime import datetime

# Настраиваем логирование
logging.basicConfig(
filename='ftp_automation.log',
level=logging.INFO,
format='%(asctime)s – %(levelname)s – %(message)s'
)

class FTPAutomation:
def __init__(self, server, username, password):
self.server = server
self.username = username
self.password = password
self.ftp = None

def connect(self):
"""Устанавливает соединение с FTP-сервером"""
try:
self.ftp = FTP(self.server)
self.ftp.login(self.username, self.password)
logging.info(f"Успешное подключение к {self.server}")
return True
except all_errors as e:
logging.error(f"Ошибка подключения к FTP: {e}")
return False

def disconnect(self):
"""Закрывает соединение с сервером"""
if self.ftp:
try:
self.ftp.quit()
logging.info("Соединение с FTP закрыто")
except:
logging.warning("Ошибка при закрытии соединения")

def upload_directory(self, local_dir, remote_dir):
"""Загружает директорию на FTP-сервер"""
if not self.ftp:
if not self.connect():
return False

try:
# Проверяем и создаем удаленную директорию
self.ensure_remote_directory(remote_dir)

# Загружаем все файлы и поддиректории
for root, dirs, files in os.walk(local_dir):
# Вычисляем относительный путь
rel_path = os.path.relpath(root, local_dir)
if rel_path == '.':
rel_path = ''

# Создаем текущую директорию на сервере
current_remote_dir = os.path.join(remote_dir, rel_path).replace('\\', '/')
self.ensure_remote_directory(current_remote_dir)

# Загружаем все файлы в текущей директории
for file in files:
local_file = os.path.join(root, file)
remote_file = os.path.join(current_remote_dir, file).replace('\\', '/')

try:
with open(local_file, 'rb') as f:
self.ftp.storbinary(f'STOR {remote_file}', f)
logging.info(f"Загружен файл: {remote_file}")
except all_errors as e:
logging.error(f"Ошибка загрузки файла {local_file}: {e}")

return True

except all_errors as e:
logging.error(f"Ошибка при загрузке директории {local_dir}: {e}")
return False

def ensure_remote_directory(self, path):
"""Проверяет существование директории на сервере и создает ее при необходимости"""
if path == '/' or not path:
return

# Разбиваем путь на компоненты
components = path.split('/')
current_path = ''

for component in components:
if not component:
continue

if current_path:
current_path += '/' + component
else:
current_path = '/' + component

try:
self.ftp.cwd(current_path)
# Если успешно перешли, директория существует
except all_errors:
# Создаем директорию
try:
self.ftp.mkd(component)
self.ftp.cwd(component)
logging.info(f"Создана директория: {current_path}")
except all_errors as e:
logging.error(f"Ошибка создания директории {current_path}: {e}")
raise

# Возвращаемся в корневую директорию
self.ftp.cwd('/')

# Пример использования класса
if __name__ == "__main__":
automation = FTPAutomation('ftp.example.com', 'username', 'password')

try:
# Загружаем директорию с проектом на сервер
result = automation.upload_directory('./project', '/www/project')

if result:
print("Загрузка проекта выполнена успешно")
else:
print("Произошла ошибка при загрузке проекта")
finally:
automation.disconnect()

Эти примеры демонстрируют мощь Python для автоматизации различных задач, связанных с FTP. Комбинируя эти подходы, вы сможете создавать сложные системы для работы с удаленными файлами, обеспечивая надежность, безопасность и эффективность.

Python с его модулем ftplib — это по-настоящему мощный инструмент для работы с FTP-протоколом. Мы рассмотрели все этапы от базового подключения до создания сложных автоматизированных систем. Эти знания позволят вам уверенно интегрировать FTP-функциональность в ваши проекты, автоматизировать рутинные задачи и создавать надёжные решения для передачи данных. Помните о важности обработки ошибок и безопасности — правильное применение описанных подходов сделает ваш код не только работающим, но и надёжным в промышленной эксплуатации.

Загрузка...