Python - как работать с FTP

Python — как работать с FTP?

Python — как работать с FTP?
— ввел недавно я в Google, и обалдел от количества ссылок с полезными (и не очень) материалами. Их реально много, и что бы не ковыряться в них я сделал выжимку в виде текста ниже, которая, надеюсь, будет вам полезна. Мне — точно, ибо бОльшая часть записей в моем блоге делается для себя — эдакая записная книжка, в которую иногда подглядываешь.

Итак, FTP.
Как положено любому занудному блогеру — обязательно нужно вспомнить о дате создания FTP-протокола (1971 год).

А еще — нужно рассказать, зачем он — этот самый FTP — нужен (уверен, вы и так знаете, иначе зачем бы вы искали этот материал, да еще применительно к Python?).

Понудили, и хватит. Переходим к делу.
Наиболее простым с моей точки зрения методом работы с FTP в Python является использование библиотеки ftplib, доступной по ссылке. Установить ее можно либо через pip: pip install, либо (если вы используете, например, PyCharm) — через установку Plugins: Settings — Plugins.
Подключать библиотеку к коду:
import ftplib

ftp = ftplib.FTP(host, ftp_user, ftp_password) — задаем параметры авторизации

Что бы было более понятно — представим каждый параметр в виде переменной:
host = str(input(‘Host?: ‘))
ftp_user = str(input(‘User? :’))
ftp_password = str(input(‘Password? :’))
после чего каждую переменную подключим к авторизации:
ftp = ftplib.FTP(host, ftp_user, ftp_password)

Ниже — короткое видео, демонстрирующее процесс инициализации соединения более наглядно:

После этого мы можем:

  • получить приветственное сообщение с FTP-сервера:
      1. text = ftp.getwelcome() # Кладем в переменную приветственное сообщение с FTP-сервера
      1. print(text) # Выводим сообщение на экран
  • Заходить в нужные директории:
      1. ftp.cwd(‘y’) # заходим в директорию y
  • Получать список файлов в директории:
      1. list = ftp.nlst() # загоняем в переменную list список содержимого директории

    print(list) # выводим содержимое на экран

  • Создавать каталоги:
      1. ftp.mkd(‘New’) # Создаем каталог
  • Или удалять их:
      1. ftp.rmd(‘New’) # Удаляем каталог
  • Кстати, получить список всех каталогов мы тоже можем:
      1. ftp.dir
  • Удалять файлы мы, кстати, тоже можем:
      1. ftp.delete(‘filename’)
  • А еще мы можем получать размер нужного файла:
        1. size = ftp.size(‘ResizeImages.exe’) # Запрашиваем размер файла ResizeImages.exe
      1. print(size, ‘kb’) # Выводим размер файла
  • А еще можно отправлять нужные вам команды непосредственно на FTP-сервер:
        1. FTP.sendcmd() # команду нужно указать внутри скобок, да 🙂

    Важно: команда пишется в кавычках!Сами команды вот:
    ABOR — Прервать передачу файла
    CDUP — Сменить директорию на вышестоящую
    CWD — Сменить директорию
    DELE — Удалить файл (DELE filename)
    EPSV — Войти в расширенный пассивный режим. Применяется вместо PASV
    HELP — Выводит список команд, принимаемых сервером
    LIST — Возвращает список файлов директории. Список передаётся через соединение данных
    MDTM — Возвращает время модификации файла
    MKD — Создать директорию
    NLST — Возвращает список файлов директории в более кратком формате, чем LIST. Список передаётся через соединение данных
    NOOP — Пустая операция
    PASS — Пароль
    PASV — Войти в пассивный режим. Сервер вернёт адрес и порт, к которому нужно подключиться, чтобы забрать данные. Передача начнётся при введении следующих команд: RETR, LIST и т. д.
    PORT — Войти в активный режим. Например PORT 12,34,45,56,78,89. В отличие от пассивного режима для передачи данных сервер сам подключается к клиенту
    PWD — Возвращает текущую директорию
    QUIT — Отключиться
    REIN — Реинициализировать подключение
    RETR — Скачать файл. Перед RETR должна быть команда PASV или PORT
    RMD — Удалить директорию
    RNFR и RNTO — Переименовать файл. RNFR — что переименовывать, RNTO — во что
    SIZE — Возвращает размер файла
    STOR — Закачать файл. Перед STOR должна быть команда PASV или PORT
    SYST — Возвращает тип системы (UNIX, WIN, …)
    TYPE — Установить тип передачи файла (бинарный, текстовый)
    USER — Имя пользователя для входа на сервер

    Ок, с основами разобрались … а что делать, если, например, хочется переименовать файл? Все просто:

  • ftp.rename(‘Old_name’, ‘New_name’)
  • Ой, совсем забыл… а как же сохранять файлы в FTP и сливать оттуда? На помощь в загрузке НА FTP придет следующее:
  • storlines – используется для загрузки текстовых файлов: txt, html, rst и т.д.
      1. ftp.storlines(‘filename’)
  • storbinary – необходимо для загрузки бинарных файлов: pdf, xls и прочее
      1. ftp.storbinary(‘filenames’)
  • А для сохранения файла С FTP используем конструкцию:
        1. with open(‘путь_к_каталогу_для_сохранения_файла’, ‘wb’) as f:
      1. ftp.retrbinary(‘RETR ‘ + ‘filename’, f.write)
  • Вроде как все. В случае возникновения вопросов — пожалуйста, пишите 🙂

    Спасибо за внимание!

UPD: спасибо одному из читателей блога 🙂 Отметил, что неплохо бы было добавить информацию о таймауте ожидания соединения с сервером. Добавляю 🙂

  1. ftp = ftplib.FTP('127.0.0.1', timeout=100)

Как видите — все просто 😉