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.
到目前为止我已经做了什么来解决问题:
- 最初我认为这是包含我的文件的目录的权限问题。我使用 chmod 777 /home/doug/Files 并重新 运行 我的脚本,但发生了同样的异常。
- 接下来我假设我的机器和 iSeries 之间有问题。我验证了我确实可以使用 ftp 来放置文件。我成功地能够使用 shell FTP.
将文件放在 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 类型)。
有一个我自己似乎无法解决的特殊问题..
我正在尝试 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.
到目前为止我已经做了什么来解决问题:
- 最初我认为这是包含我的文件的目录的权限问题。我使用 chmod 777 /home/doug/Files 并重新 运行 我的脚本,但发生了同样的异常。
- 接下来我假设我的机器和 iSeries 之间有问题。我验证了我确实可以使用 ftp 来放置文件。我成功地能够使用 shell FTP. 将文件放在 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 类型)。