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)
使用LISTFTP命令,我们可以检索文件列表和有关这些文件的信息。该列表存储在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')
我们得到一个二进制文件的大小。
下载文本文件
要下载文本文件,我们使用RETRFTP命令。
#!/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教程。
