9

我刚刚开始使用 Python 的 pysftp,我对如何调用它的walktree函数感到困惑。

我找到了一些代码(在http://pydoc.net/Python/pysftp/0.2.8/pysftp/找到)帮助我更好地理解我的参数应该采用什么形式

def walktree(self, remotepath, fcallback, dcallback, ucallback, recurse=True):
    '''recursively descend, depth first, the directory tree rooted at
    remotepath, calling discreet callback functions for each regular file,
    directory and unknown file type.

    :param str remotepath:
        root of remote directory to descend, use '.' to start at
        :attr:`.pwd`
    :param callable fcallback:
        callback function to invoke for a regular file.
        (form: ``func(str)``)
    :param callable dcallback:
        callback function to invoke for a directory. (form: ``func(str)``)
    :param callable ucallback:
        callback function to invoke for an unknown file type.
        (form: ``func(str)``)
    :param bool recurse: *Default: True* - should it recurse

    :returns: None

但我仍然对“为常规文件、目录和未知文件类型调用的回调函数的确切含义感到困惑。

我还浏览了官方文档: https ://media.readthedocs.org/pdf/pysftp/latest/pysftp.pdf

但它告诉我的关于这个walktree()功能的只是:

是一种强大的方法,可以递归(默认)遍历远程 目录结构,并为遇到的每个文件、目录或未知实体调用用户提供的回调函数。它用于get_xpysftp的方法中,可以很好地用于自己的投标。每个回调都提供了实体的路径名。(形式func(str):)

我觉得这并没有给我太多关于如何正确调用它的信息。

如果有人能提供一个正确调用这个函数的例子,并解释你为什么要传递你选择的参数,那将不胜感激!

4

2 回答 2

5

这是您正在寻找的示例代码。

import pysftp

file_names = []
dir_names = []
un_name = []

def store_files_name(fname):
    file_names.append(fname) 

def store_dir_name(dirname):
    dir_names.append(dirname)

def store_other_file_types(name):
    un_name.append(name)

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
sftp = pysftp.Connection(host="Your_ftp_server_name", username="ftp_username", private_key="location_of_privatekey", cnopts=cnopts)
sftp.walktree("/location_name/",store_files_name,store_dir_name,store_other_file_types,recurse=True)
print file_names,dir_names,un_name

文件名、目录名和未知文件类型分别存储在列表中file_namesdir_namesun_name

于 2019-03-21T15:28:14.743 回答
0

了解什么是回调,如果那是实际问题。

对于 的所有三个参数walktree,您需要传递对采用单个字符串参数的函数的引用。作为walktree递归目录结构,它为它找到的每个文件系统对象“回调”其中一个函数,将路径作为(字符串)参数传递给对象。

通常,您将需要一些状态(上下文)来实现函数。即对容器的引用以存储找到的路径。为了避免使用全局变量,您在问题中提到的 pysftp 示例传递了帮助程序类的方法而不是普通函数,从而将状态(flistdlist容器ulist)保留在对象实例中。

于 2014-10-29T07:25:04.037 回答