ftplib, как управлять исключением без атрибута errno?

Я хочу загрузить файл на ftp-сайте, если файл отсутствует. Это задача более сложного приложения, но в этом случае это не важно. Моя идея – проверить, присутствует ли файл с FTP.size(filename) и если ошибка равна 550 (система не может найти указанный файл), загрузите файл.

Мой (не работает) код:

 from ftplib import * ftp = FTP("ftp.test.com", "user", "password") try: ftp.size("123.zip") except ftplib.all_errors, e: if e.errno == 550: print "UPLOAD" else: print str(e) 

Возвращенная ошибка

 Traceback (most recent call last): File "<pyshell#106>", line 4, in <module> if e.errno == 550: AttributeError: 'error_perm' object has no attribute 'errno' 

или если произошла временная ошибка:

 AttributeError: 'error_temp' object has no attribute 'errno' 

Единственным решением, которое я нашел для управления кодом возврата, было следующее:

 except ftplib.all_errors, e: if str(e.args[0]).split(" ", 1)[0] == "550": print "UPLOAD" else: print str(e) 

но я думаю, что есть лучшее решение, потому что это работает, только если номер ошибки является первым словом в сообщении об исключении.

Заранее спасибо!

Я точно не знаю свойств этой ошибки, поэтому вы можете печатать dir (e), когда активируется условие except. Затем вы увидите все свойства ошибки. Тот, который почти не срабатывает, поскольку флаг является «error.message», который является строкой, поэтому вы можете построить предложение if с этим.

Вы закончите с чем-то вроде

 try: ftp.size("123.zip") except ftplib.all_errors as e: if e.message == 'message of the error' print 'UPLOAD' else: print str(e) 

Кстати, сообщение – это одно, что вы получаете, когда выполняется str (e).

Возможно, это помогает, это из документации для ftplib.

Обратите внимание: команда SIZE не стандартизирована, но поддерживается многими распространенными реализациями сервера.

Ссылка здесь

Попробуйте использовать другой способ, чтобы узнать, работает ли файл.