Учебники

Python — FTP

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

Методы в классе FTP

В python мы используем модуль ftplib, у которого есть следующие обязательные методы для вывода списка файлов по мере их передачи.

метод Описание
PWD () Текущий рабочий каталог.
CWD () Измените текущий рабочий каталог на путь.
реж ([путь [… [, центибар]]) Отображение списка каталогов пути. Необязательный cb обратного вызова передается в retrlines ().
штормы (cmd, f) Загружает текстовый файл, используя заданный FTP cmd — например, имя файла STOR.
storbinary (cmd, f [, bs = 8192]) Аналогичен storlines (), но используется для двоичных файлов.
удалить (путь) Удаляет удаленный файл, расположенный по пути.
мкд (каталог) Создает удаленный каталог.
исключение ftplib.error_temp Исключение возникает при получении кода ошибки, обозначающего временную ошибку (коды ответов в диапазоне 400–499).
исключение ftplib.error_perm Исключение возникает при получении кода ошибки, означающего постоянную ошибку (коды ответа в диапазоне 500–599).
подключиться (хост [, порт [, тайм-аут]]) Подключается к данному хосту и порту. Номер порта по умолчанию — 21, как указано в протоколе FTP.
уволиться() Закрывает соединение и выходит.

Ниже приведены примеры некоторых из вышеперечисленных методов.

Листинг файлов

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

import ftplib
 
ftp = ftplib.FTP("ftp.nluug.nl")
ftp.login("anonymous", "ftplib-example-1")
 
data = []
 
ftp.dir(data.append)
 
ftp.quit()
 
for line in data:
    print "-", line

Когда мы запускаем вышеуказанную программу, мы получаем следующий вывод:

- lrwxrwxrwx    1 0        0               1 Nov 13  2012 ftp -> .
- lrwxrwxrwx    1 0        0               3 Nov 13  2012 mirror -> pub
- drwxr-xr-x   23 0        0            4096 Nov 27  2017 pub
- drwxr-sr-x   88 0        450          4096 May 04 19:30 site
- drwxr-xr-x    9 0        0            4096 Jan 23  2014 vol

Изменение каталога

Приведенная ниже программа использует метод cwd, доступный в модуле ftplib, чтобы изменить каталог и затем извлечь необходимый контент.

import ftplib
 
ftp = ftplib.FTP("ftp.nluug.nl")
ftp.login("anonymous", "ftplib-example-1")
 
data = []
 
ftp.cwd('/pub/')          change directory to /pub/
ftp.dir(data.append)
 
ftp.quit()
 
for line in data:
    print "-", line

Когда мы запускаем вышеуказанную программу, мы получаем следующий вывод:

- lrwxrwxrwx    1 504      450            14 Nov 02  2007 FreeBSD -> os/BSD/FreeBSD
- lrwxrwxrwx    1 504      450            20 Nov 02  2007 ImageMagick -> graphics/ImageMagick
- lrwxrwxrwx    1 504      450            13 Nov 02  2007 NetBSD -> os/BSD/NetBSD
- lrwxrwxrwx    1 504      450            14 Nov 02  2007 OpenBSD -> os/BSD/OpenBSD
- -rw-rw-r--    1 504      450           932 Jan 04  2015 README.nluug
- -rw-r--r--    1 504      450          2023 May 03  2005 WhereToFindWhat.txt
- drwxr-sr-x    2 0        450          4096 Jan 26  2008 av
- drwxrwsr-x    2 0        450          4096 Aug 12  2004 comp


Извлечение файлов

После получения списка файлов, как показано выше, мы можем получить определенный файл, используя метод getfile . Этот метод перемещает копию файла из удаленной системы в локальную систему, откуда было инициировано соединение ftp.

import ftplib
import sys
 
def getFile(ftp, filename):
    try:
        ftp.retrbinary("RETR " + filename ,open(filename, 'wb').write)
    except:
        print "Error"
 
 
ftp = ftplib.FTP("ftp.nluug.nl")
ftp.login("anonymous", "ftplib-example-1")
 
ftp.cwd('/pub/')          change directory to /pub/
getFile(ftp,'README.nluug')
 
ftp.quit()

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