IOError:[Errno 13]权限被拒绝 - ftplib

时间:2012-08-10 23:39:18

标签: python ftplib

我正在尝试从ftp服务器下载文件,但我遇到了错误权限被拒绝错误。

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决定下载文件的位置(默认下载目录?)。还有另一个更适合此应用的模块吗?

更新

我应该澄清一下,服务器上的文件名不包含前面的'/'。我只是添加了它,因为它似乎有助于找到正确的文件位置和名称,因为先前的尝试在以下错误中结束      ftplib.error_perm:500未知命令。

文件的完整路径是

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

2 个答案:

答案 0 :(得分: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”,用文件名破坏命令。

答案 1 :(得分:0)

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

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