python - 为什么我在 .rename 上收到“ftplib.error_perm: 550 Access denied”?
问题描述
我正在上传一个文件,然后我想移动它。上传部分有效,但移动尝试引发访问错误。这是为什么?我也尝试移动目录中已经存在的文件,但这会导致同样的错误。
为了简化,我正在“移动”我成功写入的目录中的文件。FTP 设置允许对该帐户进行读/写/执行,并且使用 Filezilla 我也可以重命名文件。
代码:
import ftplib
testfile = "D:\movethis.txt";
session = ftplib.FTP('<IP>', '<U>', '<P>');
session.cwd("XXX\TestPyUpload\upload");
print(session.pwd());
file = open(testfile, 'rb');
session.storbinary('STOR movethis.txt', file);
session.rename("XXX\TestPyUpload\upload\movethis.txt", "XXX\TestPyUpload\upload\movethis2.txt");
file.close();
session.quit();
解决方案
session.cwd("XXX\TestPyUpload\upload");
您当前的工作目录现在是XXX\TestPyUpload\upload
.
session.storbinary('STOR movethis.txt', file);
这会将文件保存movethis.txt
到您当前的工作目录中,即路径为XXX\TestPyUpload\upload\movethis.txt
.
session.rename("XXX\TestPyUpload\upload\movethis.txt", "XXX\TestPyUpload\upload\movethis2.txt");
目前尚不清楚究竟XXX
是什么。但是,如果它不以 a 开头,\
则它是一条相对路径。在这种情况下,rename
命令中的名称被解释为相对于当前工作目录 ( XXX\TestPyUpload\upload
),即您将重命名XXX\TestPyUpload\upload\XXX\TestPyUpload\upload\movethis.txt
为XXX\TestPyUpload\upload\XXX\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");
(\
在开头添加)。
在这种情况下,您使用的是绝对文件名,这就是它不考虑当前工作目录的原因,从而避免了您原来的问题。