Python FTP retrieve прерывает цикл FOR . Я исправил это с помощью блока try-catch. Почему это работает?

#python #ftp #robotics

#python #ftp #робототехника

Вопрос:

Я подключаюсь к некоторым роботам на своем рабочем месте по протоколу FTP для автоматического сбора резервных данных. Скрипт должен перебирать все папки и загружать все файлы внутри. Однако, когда я запускаю приведенный ниже код, скрипт python выходит for folder in Folder_List: из цикла после первой итерации. Это странно, потому что, когда я попытался выяснить, что вызывает ошибку, введя эти команды в терминале, все прошло без ошибок.

После комментирования частей кода здесь я обнаружил, что строка ftp.retrbinary('RETR ' filename, file.write) приводит к разрыву цикла. В операционной системе robot родительской папкой является «/ ROBOT», а другие папки находятся внутри следующим образом: «/ ROBOT / JOB» или «/ROBOT / DAT»

 from ftplib import FTP
import os
import os.path

try:
    ftp = FTP('192.10.100.1')
    ftp.login('user', 'password')
    ftp.getwelcome()
    ftp.cwd('ROBOT/')

    save_dir_full = '/home/mint/Documents/robot_data'
    Folder_List = ftp.nlst()
    # Folder_List should be similar to this: 
    # Folder_List = ['JOB', 'DAT', 'CND', 'SYS', 'PRM', 'LST', 'CSV', 'LOG']

    for folder in Folder_List:
        if not(os.path.exists(save_dir_full  '/' folder)):
            try:
                os.makedirs(save_dir_full  '/' folder)
            except:
                #print('directory already exists')
                pass
        ftp.cwd(folder)
        filenames = ftp.nlst() # get filenames within the directory
        for filename in filenames:
            local_filename = os.path.join(save_dir_full  '/' folder '/'  filename)
            file = open(local_filename, 'wb')

            # THERE /
            ftp.retrbinary('RETR '  filename, file.write)

            file.close()
            print(filename)
                
        ftp.cwd('..')

    ftp.quit()
                
except:
    print('Could not connect to ftp device')
  

После того, как я добавил блок try, цикл не прервался, и программа завершилась успешно:

 try:
    ftp.retrbinary('RETR '  filename, file.write)
except:
    pass
  

У вас есть какие-либо идеи, почему это сработало?

Ответ №1:

У вас есть какие-либо идеи, почему это сработало?

Первое, что нужно сделать, это поближе взглянуть на то, что произошло, для этого замените:

 try:
    ftp.retrbinary('RETR '  filename, file.write)
except:
    pass
  

с

 try:
    ftp.retrbinary('RETR '  filename, file.write)
except Exception as e:
    print(e)
  

и наблюдайте, будет ли ваш код работать. В качестве более общего примечания использование bare except в python не рекомендуется.

Комментарии:

1. Когда я распечатываю часть содержимого, я получаю вывод: FTP-сервер 220 DX (1.07) готов. сохранение в path: backup2020W41 / ASS6.1 / 10AR01 … загрузка задания 550 не найдено 550 не найдено … загрузка DAT … загрузка CND … загрузка SYS … загрузка PRM … загрузка LST … загрузка CSV … загрузка ЖУРНАЛА Шаблон продолжает повторяться иногда с большим количеством ошибок «500 не найдено».

2. @Sayade: 550 является одним из постоянных ответов FTP с отрицательным завершением . Это означает, что файл недоступен, т.Е. Не найден, или у вас нет прав на доступ к нему.

3. Это правда, я подсчитал загруженные файлы, и в них отсутствует один файл на одну ошибку «500 не найдено». Спасибо за помощь