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