我试图从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'
Run Code Online (Sandbox Code Playgroud)
手动下载或使用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()
Run Code Online (Sandbox Code Playgroud)
另一个注意......也许我误读了文档 - http://docs.python.org/library/ftplib.html但是我不完全理解ftplib决定下载文件的位置(默认下载目录?).还有另一个模块更适合这个应用吗?
UPDATE
我应该澄清一下,服务器上的文件名不包含前面的'/'.我只是添加了因为它似乎有助于找到正确的文件位置和名称,因为之前的尝试在以下错误ftplib.error_perm:500 Unknown命令中结束.
该文件的完整路径是
ftp.glcf.umd.edu/glcf/Landsat/WRS2/p012/r018/p012r018_5dx19900722.TM-GLS1990/p012r018_5dt19900722_z20_30.tif.gz'
Run Code Online (Sandbox Code Playgroud)
它保存您要求保存的文件,在行中with open(filename,'wb') as f:,您打开文件以保存接收的内容.
并且,当您的文件名以a开头时/,它会尝试保存到/您的文件系统的root(),看起来您没有足够的权限.
试试这个:
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()
Run Code Online (Sandbox Code Playgroud)
请注意,我们更改了要在文件系统(行with open(filename[1:],'wb') as f:)中写入的文件名.如果您不了解切片操作符,请查看此问题.
此外,您应该'RETR'在代码中的字符串末尾添加一个空格字符.它应该是'RETR ' + filename代替'RETR' + filename.' RETR somefile.txt'是FTP服务器的命令,你正在做' RETRsomefile.txt',用文件名破坏命令.