获取服务器上的文件列表
使用“dir”命令返回FTP服务器中的目录列表:
>>> with ftplib.FTP('ftp.somehost.it', 'user', 'password') as ftp: ... ftp.dir()
输出示例:
drwxr-xr-x 2 ftp ftp 4096 Oct 13 14:37 . drwxr-xr-x 2 ftp ftp 4096 Oct 13 14:37 .. -rw------- 1 ftp ftp 10 Sep 10 06:04 .ftpquota -rw-r--r-- 1 ftp ftp 5306756 Oct 18 01:32 file.csv
获取文件列表的第二种方法是nlst
。
它将返回一个Python列表
>>> with ftplib.FTP('ftp.somehost.it', 'user', 'password') as ftp: ... ftp.nlst() ... ['.', '..', '.ftpquota', 'file.csv']
我们可以使用的第三种方法列出目录的内容是“MLSD”。
该方法返回一个生成器,它为每个文件产生两个元素组:每个元组的第一个元素是文件名;第二个字典包含所请求的信息及其值。
>>> with ftplib.FTP('ftp.somehost.it', 'user', 'password') as ftp: ... for filename, information in ftp.mlsd(): ... print(filename, information)
上面的代码的输出如下:
. {'type': 'cdir', 'sizd': '4096', 'modify': '20161013123732', 'unix.mode': '0755', 'unix.uid': '1809', 'unix.gid': '1811', 'unique': 'fd04g58e0a67'} .. {'type': 'pdir', 'sizd': '4096', 'modify': '20161013123732', 'unix.mode': '0755', 'unix.uid': '1809', 'unix.gid': '1811', 'unique': 'fd04g58e0a67'} .ftpquota {'type': 'file', 'size': '10', 'modify': '20160910040430', 'unix.mode': '0600', 'unix.uid': '1809', 'unix.gid': '1811', 'unique': 'fd04g58e0a9d'} file.csv {'type': 'file', 'size': '5306756', 'modify': '20161017233245', 'unix.mode': '0644', 'unix.uid': '1809', 'unix.gid': '1811', 'unique': 'fd04g58e020a'}
手动关闭FTP连接
“FTP”类可以与上下文管理器一起使用,因此当解释器退出“with”语句块时,连接会自动关闭。
但是,在必须手动关闭连接的情况下,我们必须使用'quit'方法:它在内部调用'close'方法,并向服务器发送'quit'命令以尝试正常关闭连接。
ftplib库
FTPLIB模块是Python标准库的一部分,并提供两个主要类来与FTP连接一起使用:ftblib.ftp
和ftplib.ftp_tls
。
python 创建目录,删除和重命名文件
使用python在远程FTP服务器上创建目录:
>>> ftp.mkd('newdir') 'newdir'
python更改工作目录,我们可以使用“CWD”方法:
>>> ftp.cwd('newdir') '250 OK. Current directory is /newdir'
python删除FTP现有目录,我们可以使用“RMD”方法:
>>> ftp.rmd('newdir') '250 The directory was successfully removed'
要删除常规文件,我们可以使用“delete”方法:
>>> ftp.delete('file.csv') '250 Deleted file.csv'
使用python重命名ftp文件
>>> ftp.rename('file.csv', 'file0.csv') '250 File successfully renamed or moved'
将文件上传到服务器
当我们需要将文件上传到FTP服务器时,我们也可以选择以二进制或者“行”模式执行此操作。
我们可以用于完成任务的这两种方法是:StoreBinary
和Storelines
。
Python上传文件到FTP服务器:
>>> with ftplib.FTP('host', 'user', 'password') as ftp: ... with open('onitroad.txt', 'rb') as file_object: ... ftp.storbinary('STOR onitroad.txt', file_object)
从服务器中下载文件
要从服务器中取回文件,我们可以使用“retrbinary”或者“retlines”方法。
“retrbinary”方法在二进制传输模式下取回文件。
假设我们要从服务器下载“file.csv”文件:
>>> with ftplib.FTP('ftp.somehost.it', 'user', 'password') as ftp: ... with open('file.csv', 'wb') as downloaded_file: ... ftp.retrbinary('RETR file.csv', downloaded_file.write) ... '226-File successfully transferred\n226 0.823 seconds (measured here), 6.15 Mbytes per second'
“retlines”方法有点不同,因为它以“行”的模式下载文件。
此方法的第一个参数可以是一个有效的'RETR'命令,就像我们在上一个示例中使用的命令一样,也可以是一个'LIST'(用于检索文件名列表及其相关信息)或者'NLST'(仅检索文件名)。该方法的第二个参数是可选的,是应用于每个检索行的回调(默认行为是将行打印到“stdout”)。需要注意的是,每一行都去掉了行尾字符,在Linux上是\n
。
如果我们使用'retlines'方法,我们可以逐行读取'file.csv'文件的内容:
>>> import os >>> with ftplib.FTP('host', 'user', 'password') as ftp: ... with open('file.csv', 'w') as csvfile: ... ftp.retrlines('RETR file.csv', lambda x: csfile.write("".join([x,os.linesep]))) ...
如我们已经提到的,此方法可用于使用“LIST”或者“NLST”命令返回的行。
假设我们希望将远程服务器上的目录列表写入本地文件:
>>> with ftplib.FTP('host', 'user', 'password') as ftp: ... with open('list_result', 'w') as localfile: ... ftp.retrlines('LIST', lambda x: localfile.write("".join([x, os.linesep])))
本地文件list_result
将被创建的(或者如果它已经存在),其内容将类似如下:
drwxr-xr-x 2 ftp ftp 4096 Oct 13 14:37 . drwxr-xr-x 2 ftp ftp 4096 Oct 13 14:37 .. -rw------- 1 ftp ftp 10 Sep 10 06:04 .ftpquota -rw-r--r-- 1 ftp ftp 5306756 Oct 18 01:32 file.csv
连接到FTP服务器
要连接到FTP服务器,我们要做的第一件事是创建“FTP”类的实例。
以这种方式,当我们完成工作或者发生错误时,连接将自动关闭。
with ftplib.FTP('ftp.somehost.com') as ftp: # codehere
“FTP”类构造函数的所有参数都是可选的,但是这里我们提供了它接受的第一个参数,即我们要连接的主机。如果提供了参数,则使用作为参数传递的指定主机隐式调用用于与服务器建立连接的“connect”方法,否则应显式调用该方法:
with ftplib.FTP() as ftp: ftp.connect('ftp.somehost.com')
使用用户名和密码连接
with ftplib.FTP('ftp.somehost.it', 'testuser', 'testpassword') as ftp: # codehere
或者显式调用login
方法:
with ftplib.FTP('ftp.somehost.it') as ftp: ftp.login('testuser', 'password')