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_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/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!'

重命名文件

重命名是文件代理的一种方法,名为重命名< /cIT>。它返回一个新的 重命名为文件的文件代理,因此常见模式为:

>>> 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')

如果你想上传本地工作目录,你可以 镜像到远程空字符串或点。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java骆驼传奇:跨两个Web服务协调传奇   java在JSP中更改JSP的内容而无需刷新   java getLocationOnScreen()与getLocationInWindow()的比较   swing如果鼠标在框架内,而不是在Java中,如何使框架可见?   java如何使用属性文件中的信息实例化类?   将一些java函数转换为php(char)和StringBuilder   未从请求对象接收到Java Servlet参数名称和值   java GoogleAppEngine:GenericScorer。搜索抛出NegativeArraySizeException   java Hibernate JPA悲观。写不起作用   java在SpringMVC中使用Hibernate从SQL数据库填充下拉菜单   java为什么对字符串的引用与其他对象引用的行为不同?   java正在对MockitoAnnotations返回的对象调用close()。OpenLocks(对象)是必需的吗?   unix空输出文件是在Java进程运行时生成的   爪哇没有这样的表格:货物:   java Netbeans 7.1.2无法确定WADL或WSDL   java setBackingStoreLocation   java将php搜索保存到数据库表