跳转到主要内容

ftplib的高级接口

项目描述

高级ftplib

ftplib 本身比较原始,因为它将协议的细节留给了用户去处理。 ftptool 将这些抽象化,甚至提供了一个整洁的文件管理接口。

连接与认证

代码比文字更能说明问题,让我们来看一个例子:连接。

>>> a_host = FTPHost.connect("ftp.python.org", user="foo", password="bar")

connect 是一个类方法,它允许你使用底层的 ftplib.FTP 实例创建一个 FTPHost 实例。

处理目录

更改工作目录

更改和获取当前目录是通过一个名为 current_directory 的属性实现的。它是懒加载的;它不会在询问之前询问服务器当前目录是什么。

请注意,由于它是一个属性,这实际上会向上提升一级

>>> a_host.current_directory = ".."

同样,这将进入“foo”目录

>>> a_host.current_directory = "foo"

在大多数情况下,直接指定绝对路径更容易

>>> a_host.current_directory = "/foo"

当前目录(current_directory)始终是服务器端表示;当你更改目录时,它最终会发送一个 CWD 然后一个 PWD 来获取操作的结果(因为 FTP 协议没有定义对 CWD 的回复文本。)

列出和遍历目录树

实现了 os.walk 接口来遍历目录树

>>> for (dirname, subdirs, files) in a_host.walk("/a_dir"):
...     print dirname, "has file(s)", ", ".join(files)
...
/a_dir has file(s) foo, bar
/a_dir/other_dir has file(s) hello
/a_dir/some_dir has file(s)

就像 os.walk 一样,你可以从 subdirs 列表中删除条目以避免进入它们

>>> for (dirname, subdirs, files) in a_host.walk("/a_dir"):
...     for subdir in subdirs:
...         if subdir.startswith("other_"):
...             subdirs.remove(subdir)
...     print dirname, "has file(s)", ", ".join(files)
...
/a_dir has file(s) foo, bar
/a_dir/some_dir has file(s)

你可以使用 listdir 非递归地列出目录

>>> a_host.listdir("/a_dir")
(['other_dir', 'some_dir'], ['foo', 'bar'])

创建、删除和重命名

创建目录最简单的形式是 mkdir。你只需给它一个要创建的目录,然后它就会这样做

>>> a_host.mkdir("/new_dir")

如果你只想确认目录已准备好,即存在以供上传,可以使用 makedirs,它会逐部分尝试创建目录的每个部分。

>>> a_host.makedirs("/a_dir/some_dir/a_new_dir/other_new_dir")

假设会创建 a_new_dirother_new_dir

ftptool 通过首先尝试更改到给定路径的目录,以查看其是否存在,然后更改回来来实现它。如果存在,它就简单地返回,否则逐部分创建目录。

使用文件代理

ftptool 中,文件是通过称为 FTPFileProxy 的代理对象实现的。它们表示远程主机上的文件。使用它们就像吃馅饼一样简单!

>>> a_host.file_proxy("/a_dir/foo").download_to_str()
'This is the file "foo".'
>>> a_host.file_proxy("/a_dir/new_file").upload_from_str("Hello world!")

三种上传和下载方法

ftptool 提供了三种上传或下载文件的方法:* 从/to_str:使用一个 str 对象,* 从/to_file:使用一个文件名,* 以及默认方式:使用文件-like 对象。

给定

>>> f = a_host.file_proxy("/foo.txt")

你可以使用这两个来上传和下载 str

>>> f.upload_from_str("Hi!")
>>> f.download_to_str()
'Hi!'

并且使用这样的文件名

>>> f.upload_from_file("/etc/motd")
>>> f.download_to_file("/tmp/motd")

最后,使用文件-like 对象

>>> f.upload(StringIO("Test!"))
>>> fp = StringIO()
>>> f.download(fp)
>>> fp.getvalue()
'Test!'

重命名文件

重命名是文件代理的方法,称为 rename。它返回一个新文件代理,用于重命名后的文件,所以常见的模式将是

>>> a_file = a_host.file_proxy("hello_world")
>>> a_file = a_file.rename("foobar")

这将发出重命名命令,所以 a_file 将实质上与之前相同,但有新的名称和新实例 ID。

删除文件

删除文件与重命名类似:它是文件代理的方法,称为 delete。然而,它没有有意义的返回值。

>>> a_file.delete()

镜像

ftptool 支持两种类型的镜像:本地到远程,以及远程到本地。也就是说,它可以下载整个目录及其所有子目录到本地目录,供您使用。它还可以将整个目录上传到远程主机。

第一个,下载,称为 mirror_to_local。它的用法如下

>>> a_host.mirror_to_local('/a_dir', 'my_copy_of_a_dir')

同族的,mirror_to_remote,有相同的签名;首先是源,然后是目的地。

>>> a_host.mirror_to_remote('my_copy_of_a_dir', '/a_dir')

如果本地工作目录是你想要上传的目录,你可以直接给 mirror_to_remote 一个空字符串或一个点。

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪一个,请了解更多关于 安装包 的信息。

源分发

ftptool-0.7.1.tar.gz (10.4 kB 查看哈希)

上传

由以下支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误日志 StatusPageStatusPage 状态页面