Я загружаю два файла с FTP-сервера промышленного ЧМИ C-More. Я не знаю, какая ОС работает на HMI, но я подозреваю, что у его FTP-сервера есть некоторые особенности. Используя Jython 2.7, один файл можно прочитать без труда, но другой имеет пробел в имени файла, и обычное решение с обтеканием в кавычках не работает - пока.
Следующее работает в FTP-клиенте Windows 10.
ftp> get NO_SPACES.csv
200 PORT command successful.
150 Opening ASCII mode data connection for NO_SPACES.csv.
226 Transfer complete.
ftp: 12774 bytes received in 0.27Seconds 47.66Kbytes/sec.
ftp> get "WITH SPACE.csv"
200 PORT command successful.
150 Opening ASCII mode data connection for WITH SPACE.csv.
226 Transfer complete.
ftp: 6328 bytes received in 0.02Seconds 316.40Kbytes/sec.
Все идет нормально. Теперь попробуйте на Python:
ftp = FTP(myIP) # Connect.
ftp.login(userName, password) # Login.
ftp.set_pasv(False) # Required by the C-More panel for some reason.
with io.BytesIO() as binary_buffer:
# read all of products into a binary buffer
# ftp.retrbinary("RETR NO_SPACES.csv", binary_buffer.write) # This line works.
ftp.retrbinary('RETR "WITH SPACE.csv"', binary_buffer.write) # This one doesn't.
Консоль сценариев в моей системе разработки сообщает:
ftplib.error_perm: 550 С ПРОБЕЛОМ.csv: запрошенное действие не выполнено.
- Имена файлов были изменены, чтобы защитить невиновных.
- Windows FTP любит команду
get
. Python, похоже, предпочитаетRETR
. - Я пробовал
'RETR "WITH SPACE.csv"'
и"RETR 'WITH SPACE.csv'"
. Тот же результат. - Если нужно, я могу переименовать файлы в HMI, но это потребует некоторой проверки и бумажной работы, а это совсем не весело.
- Я разрабатываю это в последней версии Ignition! SCADA-системы Inductive Automation, которая использует Jython 2.7.
У кого-нибудь есть идеи для меня, чтобы попробовать?