2012-08-10 154 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命令,但沒有「/」在本地文件您正在打開