获取使用 pysftp Connection.walktree 迭代的文件和文件夹的属性?

我正在尝试使用 pysftp 在目录下递归列出文件及其修改时间。问题是,它显示文件并不存在于所有文件中,但不存在于目录中。


这是我的代码:


class SftpOps:

    def __init__(self):

        config = ConfigManager()

        host = config.getSftpUrl()

        port = config.getSftpPort()

        user = config.getSftpUsername()

        password = config.getSftpPassword()

        self.source = config.getSourceDirRelativePath()


        cnopts = pysftp.CnOpts()

        cnopts.hostkeys.load('host_key')


        self.sftp = pysftp.Connection(

            host, port=port, username=user, password=password, cnopts=cnopts)


    def downloadSourceDir(self):

        print(self.sftp.listdir())

        self.sftp.walktree(self.source, self.fileModifiedTimeCheck,

                           self.dirModifiedTimeCheck, self.fileModifiedTimeCheck, recurse=True)

        self.sftp.close()


    def fileModifiedTimeCheck(self, filepath):

        filepath = os.path.join(self.source, filepath)

        try:

            for attr in self.sftp.listdir_attr(filepath):

                print(f"{filepath}: {attr.st_atime}")

        except FileNotFoundError as err:

            print(f"No file at: {filepath}, failed with err: {err}")

        except OSError as err:

            print("OS error: {0}".format(err))

        except:

            print("Unexpected error:", sys.exc_info()[0])

            raise


    def dirModifiedTimeCheck(self, filepath):

        filepath = os.path.join(self.source, filepath)

        try:

            for attr in self.sftp.listdir_attr(filepath):

                print(f"{filepath}: {attr.st_atime}")

            filepath = "tmp/"+filepath

        except FileNotFoundError:

            print(f"No dir at: {filepath}")

        except OSError as err:

            print("OS error: {0}".format(err))

        except:

            print("Unexpected error:", sys.exc_info()[0])

            raise



侃侃无极
浏览 297回答 2
2回答

不负相思意

您不能Connection.listdir_attr用于文件。你应该使用Connection.stat.尽管无论如何这将是非常低效的。您最好复制walktree函数的实现并使其调用Connection.listdir_attr而不是Connection.listdir. 这样,您可以通过一次对服务器的一次调用来获取目录中所有文件的时间戳,而不是逐个文件地低效地检索它们。

炎炎设计

因此,该方法似乎listdir_attr显示了目录中的当前条目,但不处理特殊条目,例如包含.和的路径..。从文档中参考这里。这就是该test文件夹未包含在您的错误消息中的原因。但是,您可以使用该lstat方法来识别文件:>>> for i in sftp.listdir():...     lstatout=str(sftp.lstat(i)).split()[0]...     if 'd' not in lstatout: #do something... 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python