Python 为什么我会得到;ftplib.error“u perm:550访问被拒绝”;打开,重命名?

Python 为什么我会得到;ftplib.error“u perm:550访问被拒绝”;打开,重命名?,python,ftp,Python,Ftp,我正在上传一个文件,然后我想移动它。上载部分工作,但移动尝试引发访问错误。为什么呢?我还尝试移动目录中已经存在的文件,但这会导致相同的错误 为了简化,我正在“移动”我成功写入的目录中的文件。FTP设置允许对帐户进行读/写/执行,使用Filezilla我还可以重命名文件 代码: 导入ftplib testfile=“D:\movethis.txt”; session=ftplib.FTP(“”,“”); cwd(“XXX\TestPyUpload\upload”); 打印(session.pwd(

我正在上传一个文件,然后我想移动它。上载部分工作,但移动尝试引发访问错误。为什么呢?我还尝试移动目录中已经存在的文件,但这会导致相同的错误

为了简化,我正在“移动”我成功写入的目录中的文件。FTP设置允许对帐户进行读/写/执行,使用Filezilla我还可以重命名文件

代码:

导入ftplib
testfile=“D:\movethis.txt”;
session=ftplib.FTP(“”,“

”); cwd(“XXX\TestPyUpload\upload”); 打印(session.pwd()); file=open(testfile,'rb'); session.storbinary('STOR movethis.txt',file); 重命名(“XXX\TestPyUpload\upload\movethis.txt”、“XXX\TestPyUpload\upload\movethis2.txt”); file.close(); session.quit();

您当前的工作目录现在是
XXX\TestPyUpload\upload

这会将文件
movethis.txt
保存到当前工作目录中,即路径为
XXX\TestPyUpload\upload\movethis.txt

尚不清楚什么是确切的
XXX
。但如果它不是以
\
开头,它就是一条相对路径。在这种情况下,
rename
命令中的名称相对于当前工作目录(
XXX\TestPyUpload\upload
)进行解释,即您将
XXX\TestPyUpload\upload\XXX\TestPyUpload\upload\movethis.txt
重命名为
XXX\TestPyUpload\upload\TestPyUpload\upload\movethis2.txt
。源目录和目标目录都不存在,这解释了服务器引发的错误

<代码>session.rename(“movethis.txt”、“movethis2.txt”)确实有效

这些名称也是相对于工作目录进行解释的,也就是说,您可以按照最初的意图将
XXX\TestPyUpload\upload\movethis.txt
重命名为
XXX\TestPyUpload\upload\\movethis2.txt

。。。
session.rename也是如此(“\XXX\TestPyUpload\upload\movethis.txt”,“\XXX\TestPyUpload\upload\movethis2.txt”)(在开头添加了
\


在这种情况下,您使用的是绝对文件名,这就是为什么它不考虑当前工作目录,从而避免了原来的问题。

您为客户端提供了代码,但对服务器一无所知,即使是服务器生成了错误消息。无论如何,我会尽量简化代码,使其不按完整路径重命名,而只按文件名重命名(即
movethis.txt
而不是
XXX\TestPyUpload\upload\movethis.txt
)。这在逻辑上应该是相同的,因为您的CWD已经是
XXX\TestPyUpload\upload
。也许它可以工作,但可能(未知)服务器限制了在上载目录中可以执行的操作(请检查您的服务器配置)。另外,您最好在代码中转义您的
\
。此外,您是否使用任何现有FTP客户端测试了重命名/移动文件?它有用吗?显示它的日志文件。@SteffenUllrich我对服务器一无所知<代码>session.rename(“movethis.txt”、“movethis2.txt”)确实有效。
session.rename也是如此(“\XXX\TestPyUpload\upload\movethis.txt”,“\XXX\TestPyUpload\upload\movethis2.txt”)(在开头添加)。奇怪的是,当我这样做时,“上传”中的文件也被重命名,文件夹“服务”保持为空:
session.rename(“\XXX\TestPyUpload\upload\movethis.txt”,“\XXX\TestPyUpload\service\movethis2.txt”)相当混乱..我明白了,谢谢。但是为什么
session.rename(“\XXX\TestPyUpload\upload\movethis.txt”、“\XXX\TestPyUpload\service\movethis2.txt”)重命名“上载”文件夹中的文件,而不是将其移动到“服务”文件夹?在执行移动之前,我发现当我cwd到“serve”目录时,我得到了550,我猜这意味着我不允许写入“serve”,但为什么文件会在不应该重命名的地方被重命名?@MapEngine:我不知道。我需要自己和服务器打交道,然后才能对此产生任何想法。但一般来说,使用
\
作为路径分隔符是一个坏主意,因为除了Windows服务器(甚至这些服务器通常也不包括
/
),分隔符通常是
/
)。此外,
\
有一个特殊的含义(如
\n
\020
…),因此应该在代码中正确转义。
session.cwd("XXX\TestPyUpload\upload");
session.storbinary('STOR movethis.txt', file);
session.rename("XXX\TestPyUpload\upload\movethis.txt", "XXX\TestPyUpload\upload\movethis2.txt");