2012-08-10 192 views
2

我试图从ftp服务器下载文件,但我遇到了错误权限被拒绝的错误。IOError:[Errno 13]权限被拒绝 - ftplib

Traceback (most recent call last): 
    File "/Users/x34/Documents/Python/ftp_download.py", line 27, in <module> 
    download() 
    File "/Users/x34/Documents/Python/ftp_download.py", line 21, in download 
    with open(filename,'wb') as f: 
IOError: [Errno 13] Permission denied: '/p012r018_5dt19900722_z20_30.tif.gz' 

手动或使用FileZilla的下载工作正常,但我下面的脚本不

from ftplib import ftp  
ftp = FTP(r'ftp.glcf.umd.edu') 
ftp.login() 

directory = 'glcf/Landsat/WRS2/p012/r018/p012r018_5dx19900722.TM-GLS1990' 
filename = '/p012r018_5dt19900722_z20_30.tif.gz' 

ftp.cwd(directory) 

with open(filename,'wb') as f: 
    ftp.retrbinary('RETR' + filename,f.write) 

ftp.close() 

彼此音符......也许我看错文档 - http://docs.python.org/library/ftplib.html但我不完全明白的地方FTPLIB决定下载文件(默认下载目录?)。是否有另一个模块更适合此应用程序?

UPDATE

我要澄清的是,服务器上的文件名不包含前面的“/”。我只是补充说,因为它似乎有助于找到正确的文件位置和名称,因为之前的尝试在以下错误中结束: ftplib.error_perm:500未知命令。

的完整路径,该文件是

ftp.glcf.umd.edu/glcf/Landsat/WRS2/p012/r018/p012r018_5dx19900722.TM-GLS1990/p012r018_5dt19900722_z20_30.tif.gz' 
+1

它看起来像你的脚本试图下载的内容将文件保存在根目录(/ ')你的文件系统。你有足够的权限吗? 它试图用原始文件名保存文件,并在前面加上'/',从而在'/'处创建文件。 – 2012-08-10 23:43:02

+0

添加/在前面的主要原因是,它似乎向前迈进了一步,因为在它给我另一个错误之前,这是该追踪的最后部分 - >“/Library/Frameworks/Python.framework/Versions/2.7 /lib/python2.7/ftplib.py“,第219行,在getresp中 raise error_perm,resp ftplib.error_perm:500未知命令。 – BJEBN 2012-08-10 23:58:45

+1

尝试在代码中的“REPR”后添加空格字符。我已经更新了答案中的代码。您将“REPR”与文件名连接起来,但正确的是:“REPR文件。txt“ – 2012-08-11 01:13:39

回答

5

它,你问它来保存,在该行with open(filename,'wb') as f:保存您的文件,你打开的文件保存接收到的内容。

而且,由于您的文件名以/开头,因此它会尝试保存到您的文件系统的根目录(/),其中看起来您没有足够的权限。

试试这个:我们改变了文件名

from ftplib import ftp  
ftp = FTP(r'ftp.glcf.umd.edu') 
ftp.login() 

directory = 'glcf/Landsat/WRS2/p012/r018/p012r018_5dx19900722.TM-GLS1990' 
filename = '/p012r018_5dt19900722_z20_30.tif.gz' 

ftp.cwd(directory) 

with open(filename[1:],'wb') as f: # slices the string, "cutting" out the "/" 
    ftp.retrbinary('RETR ' + filename,f.write) 

ftp.close() 

通知到你的文件系统(线with open(filename[1:],'wb') as f:)被写入。如果您不知道切片运算符,请查看question

此外,您应该在代码中的'RETR'字符串末尾放置一个空格字符。它应该是'RETR ' + filename而不是'RETR' + filename。 'RETR somefile.txt'是一个到FTP服务器的命令,并且你正在做'RETRsomefile.txt',使用文件名破坏命令。

+0

我在我的电脑和Mac上都尝试了你的建议,但无济于事,因为它给了我”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py“错误,行219,在getresp中增加error_perm,resp ftplib.error_perm:500未知的命令------如果有人想尝试只有我的电脑,ftp站点对公众免费吗? – BJEBN 2012-08-11 00:24:22

+0

在修改代码后, 'RETR'结束时,我收到服务器的权限错误 – 2012-08-11 01:19:05

+0

哦,哇,空间做了诀窍...感谢stummjr为你的耐心,真的为我节省了很多时间。 – BJEBN 2012-08-11 06:49:02

0

您在两个地方使用相同的文件名变量,我假设根目录“/”对您的ftp有效,但显然是本地的权限问题。

尝试使用“/”,在ftp命令,但没有“/”在本地文件您正在打开