为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

侃侃无极 2022-06-02 18:17:42
我正在尝试使用 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
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

您不能Connection.listdir_attr用于文件。

你应该使用Connection.stat.

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


查看完整回答
反对 回复 2022-06-02
?
炎炎设计

TA贡献1808条经验 获得超4个赞

因此,该方法似乎listdir_attr显示了目录中的当前条目,但不处理特殊条目,例如包含.和的路径..。从文档中参考这里。这就是该test文件夹未包含在您的错误消息中的原因。


但是,您可以使用该lstat方法来识别文件:


>>> for i in sftp.listdir():

...     lstatout=str(sftp.lstat(i)).split()[0]

...     if 'd' not in lstatout: #do something

... 


查看完整回答
反对 回复 2022-06-02
  • 2 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信