Pregunta

SftpClient al parecer no tiene un exists método. Este es mi implementación actual:

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

¿Hay una mejor manera de hacer esto? Comprobación de la subcadena en mensajes de excepción es bastante feo y puede no ser fiable.

¿Fue útil?

Solución

Vea la errno módulo para las constantes que definen todos los errores códigos. Además, es un poco más claro a utilizar el atributo de __init__ la excepción que la expansión de los argumentos <=>, así que me gustaría hacer esto:

except IOError, e: # or "as" if you're using Python 3.0
  if e.errno == errno.ENOENT:
    ...

Otros consejos

No hay "existe" método definido para SFTP (no sólo paramiko), por lo que su método está muy bien.

Creo que el control de la errno es un poco más limpio:

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

paramiko eleva literalmente FileNotFoundError

def sftp_exists(sftp, path):
    try:
        sftp.stat(path)
        return True
    except FileNotFoundError:
        return False
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top