我正在尝试使用 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
. 这样,您可以通过一次对服务器的一次调用来获取目录中所有文件的时间戳,而不是逐个文件地低效地检索它们。
炎炎设计
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
...
添加回答
举报
0/150
提交
取消