Python 将文件放到 iSeries 上时 ftplib 错误 426

Python ftplib error 426 when putting files on iSeries

有一个我自己似乎无法解决的特殊问题..

我正在尝试 FTP 使用 Python 的 ftplib 库将目录中的文件列表传输到 iSeries IFS。

请注意,文件位于 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 来放置文件。我成功地能够使用 shell FTP.
  3. 将文件放在 iSeries IFS 上

谢谢!

解决方案

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)

正如所写,您的代码正在尝试执行以下 FTP 命令:

STOR /home/doug/Files/FILE.csv

意味着它正在尝试在 IFS 上创建 /home/doug/Files/FILE.csv。这是你想要的吗?我怀疑它不是,因为您费心将远程目录更改为 /STUFF/HERE/.

如果您尝试发出命令

STOR FILE.csv

那么你必须小心处理你命名为 file 的 Python 变量。通常,不建议您重新分配作为 for 循环目标的变量,正是因为可能会发生这种类型的混淆。为 localpath + file 选择一个不同的变量名称,并在 open(..., 'rb').

中使用它

顺便说一下,您似乎在使用 Python 2,因为有一个没有括号的 print 语句。我相信您现在已经知道 Python 3 是推荐的,但是如果您坚持使用 Python 2,建议您避免使用 file 作为变量名,因为它实际上意味着 Python 2 中的某些东西(它是一种类型的名称;具体来说,open 函数的 return 类型)。