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-сервера:
-
- text = ftp.getwelcome() # Кладем в переменную приветственное сообщение с FTP-сервера
-
- print(text) # Выводим сообщение на экран
-
- Заходить в нужные директории:
-
- ftp.cwd(‘y’) # заходим в директорию y
-
- Получать список файлов в директории:
-
- list = ftp.nlst() # загоняем в переменную list список содержимого директории
print(list) # выводим содержимое на экран
-
- Создавать каталоги:
-
- ftp.mkd(‘New’) # Создаем каталог
-
- Или удалять их:
-
- ftp.rmd(‘New’) # Удаляем каталог
-
- Кстати, получить список всех каталогов мы тоже можем:
-
- ftp.dir
-
- Удалять файлы мы, кстати, тоже можем:
-
- ftp.delete(‘filename’)
-
- А еще мы можем получать размер нужного файла:
-
-
- size = ftp.size(‘ResizeImages.exe’) # Запрашиваем размер файла ResizeImages.exe
-
-
- print(size, ‘kb’) # Выводим размер файла
-
- А еще можно отправлять нужные вам команды непосредственно на FTP-сервер:
-
-
- 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 и т.д.
-
- ftp.storlines(‘filename’)
-
- storbinary – необходимо для загрузки бинарных файлов: pdf, xls и прочее
-
- ftp.storbinary(‘filenames’)
-
- А для сохранения файла С FTP используем конструкцию:
-
-
- with open(‘путь_к_каталогу_для_сохранения_файла’, ‘wb’) as f:
-
-
- ftp.retrbinary(‘RETR ‘ + ‘filename’, f.write)
-
- Вроде как все. В случае возникновения вопросов — пожалуйста, пишите 🙂
Спасибо за внимание!
UPD: спасибо одному из читателей блога 🙂 Отметил, что неплохо бы было добавить информацию о таймауте ожидания соединения с сервером. Добавляю 🙂
-
ftp = ftplib.FTP('127.0.0.1', timeout=100)
Как видите — все просто 😉