Загрузка файла с пробелом в имени файла с помощью ftplib

Я загружаю два файла с 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: запрошенное действие не выполнено.

  1. Имена файлов были изменены, чтобы защитить невиновных.
  2. Windows FTP любит команду get. Python, похоже, предпочитает RETR.
  3. Я пробовал 'RETR "WITH SPACE.csv"' и "RETR 'WITH SPACE.csv'". Тот же результат.
  4. Если нужно, я могу переименовать файлы в HMI, но это потребует некоторой проверки и бумажной работы, а это совсем не весело.
  5. Я разрабатываю это в последней версии Ignition! SCADA-системы Inductive Automation, которая использует Jython 2.7.

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


person Transistor    schedule 20.12.2020    source источник


Ответы (1)


У ftplib нет проблем с пробелами. Проблема заключается в кавычках, которые вы добавляете к команде RETR. Кавычек быть не должно:

ftp.retrbinary('RETR WITH SPACE.csv', binary_buffer.write)

Если вы включите режим отладки в ftp с помощью переключателя -d, вы увидите, что он также не отправляет кавычки на FTP-сервер в команде RETR:

ftp> get "WITH SPACE.csv"
---> PORT 127,0,0,1,15,145
200 Port command successful
---> RETR WITH SPACE.csv
150 Opening data channel for file download from server of "/WITH SPACE.csv"
226 Successfully transferred "/WITH SPACE.csv"
ftp: 12 bytes received in 0.00Seconds 12000.00Kbytes/sec.

Обратите внимание, что get – это команда ftp клиента пользователя из командной строки, которая преобразуется в команду RETR протокола FTP.

person Martin Prikryl    schedule 20.12.2020
comment
Да! FTP-клиент командной строки Windows 10 требует их. Я не думал, что есть смысл пробовать ftplib без них. Благодарю вас! - person Transistor; 20.12.2020