我正试图从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'

最佳答案

它将您的文件保存到您要求它保存的位置,在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()

注意,我们更改了要写入文件系统的文件名(linewith open(filename[1:],'wb') as f:)。如果你不知道slice操作符,看看这个question
另外,您应该在代码中'RETR'字符串的末尾加上一个空格字符。它应该是'RETR ' + filename而不是'RETR' + filenameRETR somefile.txt'是FTP服务器的命令,您正在执行“RETRsomefile.txt”,损坏了文件名为的命令。

关于python - IOError:[Errno 13]权限被拒绝-ftplib,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11910579/

10-11 13:27