#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 не найдено». Спасибо за помощь