18

Paramiko的SFTPClient显然没有exists方法。这是我目前的实现:

def rexists(sftp, path):
    """os.path.exists for paramiko's SCP object
    """
    try:
        sftp.stat(path)
    except IOError, e:
        if 'No such file' in str(e):
            return False
        raise
    else:
        return True

有一个更好的方法吗?检查异常消息中的子字符串非常难看,而且可能不可靠。

4

3 回答 3

20

有关定义所有这些错误代码的常量,请参见errno模块。此外,使用errno异常的属性比使用__init__args 的扩展更清楚,所以我会这样做:

except IOError, e: # or "as" if you're using Python 3.0
  if e.errno == errno.ENOENT:
    ...
于 2009-09-08T00:29:06.087 回答
9

Paramiko 从字面上加注FileNotFoundError

def sftp_exists(sftp, path):
    try:
        sftp.stat(path)
        return True
    except FileNotFoundError:
        return False
于 2019-01-05T23:10:06.407 回答
7

没有为 SFTP 定义“存在”方法(不仅仅是 paramiko),所以你的方法很好。

我认为检查 errno 会更干净一些:

def rexists(sftp, path):
    """os.path.exists for paramiko's SCP object
    """
    try:
        sftp.stat(path)
    except IOError, e:
        if e[0] == 2:
            return False
        raise
    else:
        return True
于 2009-05-12T02:16:12.727 回答