FTPLIB的高级接口
ftptool的Python项目详细描述
更高级别的ftplib
ftplib本身有点粗糙,因为它为 要处理的用户。ftptool将其抽象化,甚至提供了一个整洁的 文件管理接口。
连接和身份验证
代码不仅仅是文字,所以让我们来看一个例子:连接。
>>> a_host = FTPHost.connect("ftp.python.org", user="foo", password="bar")
connect是一个classmethod,它允许您使用 基本的ftp实例。
使用目录
更改工作目录
更改和获取当前目录是作为一个名为 当前目录。它很懒;它不会询问服务器当前 直到你要的时候才知道。
请注意,由于它是一个属性,因此实际上会向上提升一个级别:
>>> a_host.current_directory = ".."
类似地,这将下降到“foo”目录:
>>> a_host.current_directory = "foo"
在大多数情况下,只需指定绝对路径就更容易了:
>>> a_host.current_directory = "/foo"
当前目录 更改目录,它将发送一个CWD,然后发送一个PWD,以获取 操作的结果(因为ftp协议没有定义 文本到CWDis.)
列出并遍历目录树
实现了一个用于遍历目录树的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一样,您可以删除子列表中的条目以避免 降序排列:
>>> 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_dir和other_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/from_str:使用str对象, *到/从文件:使用文件名, *默认情况下:使用类似文件的对象。
给定:
>>> 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")
最后,使用类似文件的对象:
>>> f.upload(StringIO("Test!")) >>> fp = StringIO() >>> f.download(fp) >>> fp.getvalue() 'Test!'
重命名文件
重命名是文件代理的一种方法,名为
>>> a_file = a_host.file_proxy("hello_world") >>> a_file = a_file.rename("foobar")
这也会发出一个重命名命令,因此一个文件本质上是相同的 与以前一样,使用新名称和新实例ID。
删除文件
<>删除文件就像重命名它:它是文件代理的一种方法, 称为删除。但是,它没有有意义的返回值。>>> a_file.delete()
镜像
ftptool支持两种类型的镜像:本地到远程和远程到 当地人。与中一样,它可以将整个目录和所有子目录下载到 本地目录,供您播放WI是的。它还可以将整个目录上载到 远程主机。
第一个是下载,叫做镜像到本地。它的用法如下:
>>> a_host.mirror_to_local('/a_dir', 'my_copy_of_a_dir')
表兄mirror_to_remote有相同的签名;首先是source,然后是 目的地。
>>> a_host.mirror_to_remote('my_copy_of_a_dir', '/a_dir')
如果你想上传本地工作目录,你可以 镜像到远程空字符串或点。