获取服务器上的文件列表

使用“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'}
如何使用Python连接FTP服务器

手动关闭FTP连接

“FTP”类可以与上下文管理器一起使用,因此当解释器退出“with”语句块时,连接会自动关闭。

但是,在必须手动关闭连接的情况下,我们必须使用'quit'方法:它在内部调用'close'方法,并向服务器发送'quit'命令以尝试正常关闭连接。

ftplib库

FTPLIB模块是Python标准库的一部分,并提供两个主要类来与FTP连接一起使用:ftblib.ftpftplib.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服务器时,我们也可以选择以二进制或者“行”模式执行此操作。
我们可以用于完成任务的这两种方法是:StoreBinaryStorelines

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')
日期:2020-07-07 20:54:37 来源:oir作者:oir