2

我正在尝试从 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 Unknown command 结束。

文件的完整路径是

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

2 回答 2

6

它将您的文件保存在您要求它保存的位置,在with open(filename,'wb') as f:您打开文件以保存接收到的内容的行中。

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

试试这个:

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:)。如果您不了解切片运算符,请看一下这个问题。

'RETR'此外,您应该在代码中的字符串末尾放置一个空格字符。它应该'RETR ' + filename代替'RETR' + filename. ' RETR somefile.txt' 是对 FTP 服务器的命令,而您正在执行 ' RETRsomefile.txt',从而破坏了带有文件名的命令。

于 2012-08-10T23:58:53.003 回答
0

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

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

于 2012-08-11T00:02:48.417 回答