Python - FTP

FTP(File Transfer Protocol,文件传输协议)是用于在网络上进行文件传输的一套标准协议,用于在网络中的计算机之间传输文件。它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个"三次握手"的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。

FTP 是在客户端服务器架构上创建的,可以与用户身份验证一起使用。 它也可以在没有身份验证的情况下使用,但安全性较低。 维护当前工作目录和其他标志的 FTP 连接,每次传输都需要一个辅助连接,通过它传输数据。 大多数常见的 Web 浏览器都可以检索托管在 FTP 服务器上的文件。


FTP 类的方法

在 python 中,我们使用模块 ftplib,它具有以下必需的方法来列出文件,因为我们将传输文件。

方法说明
pwd() 当前工作目录。
cwd() 将当前工作目录更改为路径。
dir([path[,...[,cb]]) 显示路径的目录列表。 传递给 retrlines() 的可选回调 cb。
storlines(cmd, f) 使用给定的 FTP 命令上传文本文件 - 例如,STOR 文件名。
storbinary(cmd,f[, bs=8192]) 类似于 storlines() 但用于二进制文件。
delete(path) 删除位于路径的远程文件。
mkd(directory) 创建远程目录。
exception ftplib.error_temp 当收到表示临时错误的错误代码(400-499 范围内的响应代码)时引发异常。
exception ftplib.error_perm 当收到表示永久错误的错误代码(响应代码在 500–599 范围内)时引发异常。
connect(host[, port[, timeout]]) 连接到给定的主机和端口。 默认端口号为 21,由 FTP 协议指定。
quit() 关闭连接并退出。

下面是上述一些方法的例子。


列出文件

下面的示例使用匿名登录到 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

改变目录

下面的程序使用 ftplib 模块中的 cwd 方法来更改目录,然后获取所需的内容。

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 文件存在于启动连接的本地系统中。