Python ftplib ошибка 426 при размещении файлов на iSeries - PullRequest
0 голосов
/ 26 июня 2018

Возникла специфическая проблема, которую я не могу устранить самостоятельно.

Я пытаюсь передать список файлов в каталоге по FTP на IFS iSeries с использованием библиотеки ftplib Python.

Обратите внимание, что файлы находятся в одном подкаталоге по сравнению со скриптом Python.

Ниже приведен фрагмент кода, который доставляет мне проблемы:

from ftplib import FTP
import os

localpath = os.getcwd() + '/Files/'

def putFiles():
    hostname = 'host.name.com'
    username = 'myuser'
    password = 'mypassword'
    myftp = FTP(hostname)
    myftp.login(username, password)
    myftp.cwd('/STUFF/HERE/')
        for file in os.listdir(localpath):
            if file.endswith('.csv'):
                try:
                    file = localpath + file
                    print 'Attempting to move ' + file
                    myftp.storbinary("STOR " + file, open(file, 'rb'))
                except Exception as e:
                    print(e)

Конкретная ошибка, которую я получаю, является:

Attempting to move /home/doug/Files/FILE.csv
426-Unable to open or create file /home/doug/Files to receive data.
426 Data transfer ended.

Что я сделал до сих пор для устранения неполадок:

  1. Сначала я думал, что это проблема с разрешениямив каталоге, содержащем мои файлы.Я использовал chmod 777 / home / doug / Files и повторно запустил свой скрипт, но произошло то же исключение.
  2. Затем я предположил, что между моей машиной и iSeries возникла проблема.Я подтвердил, что действительно могу поместить файлы, используя ftp.Мне удалось поместить файл на IFS iSeries с помощью оболочки FTP.

Спасибо!

Решение

from ftplib import FTP
import os

localpath = os.getcwd() + '/Files/'

def putFiles():
    hostname = 'host.name.com'
    username = 'myuser'
    password = 'mypassword'
    myftp = FTP(hostname)
    myftp.login(username, password)
    myftp.cwd('/STUFF/HERE/')
        for csv in os.listdir(localpath):
            if csv.endswith('.csv'):
                try:
                    myftp.storbinary("STOR " + csv, open(localpath + csv, 'rb'))
                except Exception as e:
                    print(e)

1 Ответ

0 голосов
/ 26 июня 2018

Как написано, ваш код пытается выполнить следующую команду FTP:

STOR /home/doug/Files/FILE.csv

Это означает, что он пытается создать /home/doug/Files/FILE.csv на IFS.Это то, что вы хотите?Я подозреваю, что это не так, учитывая, что вы удосужились изменить удаленный каталог на /STUFF/HERE/.

Если вы пытаетесь выполнить команду

STOR FILE.csv

, то вы должны бытьосторожно, как вы имеете дело с переменной Python, которую вы назвали file.В общем случае не рекомендуется переназначать переменную, которая является целью цикла for, именно потому, что может возникнуть такая путаница.Выберите другое имя переменной для localpath + file и используйте его в своем open(..., 'rb').

Кстати, похоже, что вы используете Python 2, поскольку существует голый оператор print без скобок.Я уверен, что вы знаете, что сейчас рекомендуется Python 3, но если вы придерживаетесь Python 2, рекомендуется избегать использования file в качестве имени переменной, потому что это действительно что-то значит в Python 2 (этоимя типа, в частности, тип возврата функции open).

...