PythonFTP编程教程展示了如何使用ftplib
库在Python中使用FTP。我们将连接到FTP服务器、列出目录、下载和上传文件。
FTP
文件传输协议(FTP)是一种标准网络协议,用于在计算机网络上的客户端和服务器之间传输计算机文件。客户端和服务器通过一组FTP命令进行通信,例如DELE、RETR或CWD。
许多服务器提供匿名FTP访问的FTP服务;例如,有些Linux托管站点提供匿名FTP帐户来下载分发映像。
Python文件库
Pythonftplib
是一个实现FTP协议客户端的模块。它包含一个FTP客户端类和一些辅助函数。
PythonFTP类
ftplib.FTP
创建FTP类的一个新实例。当给定主机时,将使用connect
方法建立到主机的连接。
上下文管理器
与Python3不同,Python2没有使用FTP类实现的上下文管理器。因此,Python2代码在处理连接对象时需要一种稍微不同的方法。
import ftplib with ftplib.FTP('ftp.debian.org') as ftp:
with
命令将自动关闭Python3代码与服务器的连接。
import ftplib from contextlib import closing with closing(ftplib.FTP('ftp.debian.com')) as ftp:
对于Python2代码,我们需要使用contextlib
模块的closing
方法。
欢迎辞
getwelcome
返回服务器为回复初始连接而发送的欢迎消息。此消息可能包含一些对用户有用的信息。
#!/usr/bin/python import ftplib with ftplib.FTP('ftp.debian.org') as ftp: print(ftp.getwelcome())
该示例创建到DebianFTP服务器的连接,该服务器有一个匿名帐户并返回其欢迎消息。
$ ./welcome.py 220 ftp.debian.org FTP server
目录列表
dir
方法生成目录列表。
#!/usr/bin/python import ftplib with ftplib.FTP('ftp.debian.org') as ftp: try: ftp.login() files = [] ftp.dir(files.append) print(files) except ftplib.all_errors as e: print('FTP error:', e)
该示例连接到ftp.debian.org
主机并检索初始登陆目录的目录列表。
try: ftp.login()
当login
方法没有参数时;我们连接到FTP站点的匿名帐户。
files = [] ftp.dir(files.append)
dir
方法生成目录列表并将数据添加到列表中。
$ ./listing.py ['drwxr-xr-x 9 1176 1176 4096 Sep 26 15:07 debian']
FTP命令
FTP客户端向FTP服务器发送命令,如PWD
或RETR
。ftplib包含几个包装这些命令的方法。命令通过sendcmd
或voidcmd
方法发送。
#!/usr/bin/python import ftplib with ftplib.FTP('ftp.debian.org') as ftp: try: ftp.login() wdir = ftp.sendcmd('PWD') print(ftplib.parse257(wdir)) wdir2 = ftp.pwd() print(wdir2) except ftplib.all_errors as e: print('FTP error:', e)
该示例通过直接发送PWD
命令并使用pwd
方法来检索当前工作目录。
wdir = ftp.sendcmd('PWD')
我们使用sendcmd
方法发送PWD
命令。
print(ftplib.parse257(wdir))
parse257
是一个辅助方法,它从返回的字符串中检索目录,该字符串还包含状态代码。
wdir2 = ftp.pwd() print(wdir2)
这里我们使用pwd
方法获取当前工作目录。
$ ./ftp_commands.py / /
改变目录
cwd
方法改变当前工作目录。
#!/usr/bin/python import ftplib with ftplib.FTP('ftp.debian.org') as ftp: try: ftp.login() wdir = ftp.pwd() print(wdir) ftp.cwd('debian') wdir2 = ftp.pwd() print(wdir2) except ftplib.all_errors as e: print('FTP error:', e)
范例使用cmd
方法切换到debian
文件夹。
$ ./change_directory.py / /debian
创建目录
目录是用mkd
方法创建的。此操作需要具有足够权限的用户帐户;它不适用于匿名帐户。
#!/usr/bin/python import ftplib from contextlib import closing with closing(ftplib.FTP('ftp.example.com')) as ftp: try: ftp.login('user7', 's$cret') ftp.mkd('newdir') files = [] ftp.retrlines('LIST', files.append) for fl in files: print(fl) except ftplib.all_errors as e: print('FTP error:', e)
该示例连接到FTP服务器并在登录文件夹中创建一个新目录。
ftp.login('user7', 's$cret')
我们使用login
方法登录。
ftp.mkd('newdir')
使用mkd
方法创建一个新目录。
files = [] ftp.retrlines('LIST', files.append)
使用LIST
FTP命令,我们可以检索文件列表和有关这些文件的信息。该列表存储在files
列表中。
$ ./create_directory.py drwx------ 6 example.com 117992 7 Sep 27 14:58 . drwx------ 6 example.com 117992 7 Sep 27 14:58 .. -rw------- 1 example.com 117992 151 Jul 31 2015 .htaccess drwxr-xr-x 2 0 0 4096 Sep 27 01:16 logs drwx---r-x 2 example.com 117992 2 Sep 27 14:58 newdir drwx------ 3 example.com 117992 3 Mar 11 2011 sub drwx------ 26 example.com 117992 31 Sep 25 15:32 web
从输出中我们可以看到newdir
已创建。
获取文本文件的大小
SIZE
命令及其size
方法等价于非标准区域确定文件大小的方法。尽管没有标准化,但它已被许多服务器实现。
#!/usr/bin/python import ftplib with ftplib.FTP('ftp.debian.org') as ftp: try: ftp.login() size = ftp.size('debian/README') print(size) except ftplib.all_errors as e: print('FTP error:', e)
该示例使用size
方法检索README文件的大小。
获取二进制文件的大小
要确定二进制文件的大小,我们必须切换到二进制模式。
#!/usr/bin/python import ftplib with ftplib.FTP('ftp.debian.org') as ftp: try: ftp.login() # TYPE A for ASCII mode ftp.sendcmd('TYPE I') size = ftp.size('debian/ls-lR.gz') print(size) except ftplib.all_errors as e: print('FTP error:', e)
该示例确定二进制文件的大小。
ftp.sendcmd('TYPE I')
我们使用TYPEI
命令进入二进制模式。
size = ftp.size('debian/ls-lR.gz')
我们得到一个二进制文件的大小。
下载文本文件
要下载文本文件,我们使用RETR
FTP命令。
#!/usr/bin/python import ftplib import os with ftplib.FTP('ftp.debian.org') as ftp: file_orig = '/debian/README' file_copy = 'README' try: ftp.login() with open(file_copy, 'w') as fp: res = ftp.retrlines('RETR ' + file_orig, fp.write) if not res.startswith('226 Transfer complete'): print('Download failed') if os.path.isfile(file_copy): os.remove(file_copy) except ftplib.all_errors as e: print('FTP error:', e) if os.path.isfile(file_copy): os.remove(file_copy)
该示例从ftp.debian.org
服务器下载一个文本文件。
with open(file_copy, 'w') as fp: res = ftp.retrlines('RETR ' + file_orig, fp.write)
我们获取文件并写入本地副本文件。
if not res.startswith('226 Transfer complete'): print('Download failed') if os.path.isfile(file_copy): os.remove(file_copy)
如果下载失败,我们会打印一条错误消息并删除本地文件。
上传文本文件
STOR
命令与storlines
方法用于上传文本文件。
#!/usr/bin/python import ftplib with ftplib.FTP('ftp.example.com') as ftp: filename = 'README' try: ftp.login('user7', 's$cret') with open(filename, 'rb') as fp: res = ftp.storlines("STOR " + filename, fp) if not res.startswith('226 Transfer complete'): print('Upload failed') except ftplib.all_errors as e: print('FTP error:', e)
在这个例子中,我们将一个文本文件上传到FTP服务器。
在本教程中,我们使用了Pythonftplib
。
阅读Python教程或列出所有Python教程。