2012-07-14 46 views
2

我試圖從FTP服務器上下載一個.zip文件,我不斷收到此錯誤:獲取類型錯誤試圖從FTP服務器下載.zip文件時

File "C:/filename.py", line 37, in handleDownload 
file.write(block) 
TypeError: descriptor 'write' requires a 'file' object but received a 'str' 

這裏是我的代碼(從http://postneo.com/stories/2003/01/01/beyondTheBasicPythonFtplibExample.html借來的):

def handleDownload(block): 
    file.write(block) 
    print ".", 

ftp = FTP('ftp.godaddy.com') # connect to host 
ftp.login("auctions") # login to the auctions directory 
print ftp.retrlines("LIST") 
filename = 'auction_end_tomorrow.xml.zip' 
file = open(filename, 'wb') 
ftp.retrbinary('RETR ' + filename, handleDownload) 
file.close() 
ftp.close() 
+0

在Python 2.7上運行該代碼可成功下載文件。這是整個代碼示例嗎?我添加的所有內容都是'import'語句:'從ftplib導入FTP',並且它對我來說工作正常。 – 2012-07-14 21:50:22

+0

被稱爲「block」的變量(有一個值,在代碼中沒有顯示)應該是一個文件對象,而不是一個字符串(相當明顯)。如果您包含更多代碼,我可能會爲您提供更多幫助。 – alexy13 2012-07-14 21:50:57

回答

2

我不能把這重現自己,但我發生了什麼事的想法 - 我只是不知道如何發生了。希望有人可以參加。請注意,file未通過處理下載,而file也是內置類型的名稱。如果file都留給內置的,那麼你會得到完全此錯誤:

>>> file 
<type 'file'> 
>>> file.write("3") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: descriptor 'write' requires a 'file' object but received a 'str' 

所以我覺得有些問題是file,內置的,和file之間的混淆,打開的文件本身。 (可能使用比"file"其他名字在這裏是個好主意。)無論如何,如果你只是使用

ftp.retrbinary('RETR ' + filename, file.write) 

而且完全無視handleDownload功能,它應該工作。另外,如果你想保持點打印每一塊,你可能是一個小票友,並喜歡寫東西

def handleDownloadMaker(openfile): 
    def handleDownload(block): 
     openfile.write(block) 
     print ".", 
    return handleDownload 

這是一個函數,它返回一個指向正確的文件的功能。之後,

ftp.retrbinary('RETR' + filename, handleDownloadMaker(file)) 

也應該工作。

+0

繁榮,偉大的東西,新功能的第二個解決方案爲我工作,只需要添加我想寫入的目錄到文件中:file = open(filename,'wb')。 第一個解決方案也起作用了,但是當我檢查下載的文件時,它被破壞了,所以我下載的文件可能太大,不能單獨下載。 非常感謝您的幫助。 – 2012-07-14 22:50:12

+0

嗨,剛剛閱讀你的答案,我試圖寫入文件onftp = FTP('域名') >>> ftp.login('user','pass') >>> file11 = open('CallXml .xml','w') >>> file11.write('Hello World') >>> file11.write('This is xyz here') >>> file11.write('很高興與您交談所有') >>> file11.close() >>> file11 = open('CallXml.xml','r')content = file11.read()print content打印正確的內容,但是當我登錄到godaddy並檢查文件它沒有更新,請讓我知道爲什麼它不在godaddy服務器上的文件更新? – GoGreen 2013-05-06 16:38:19

相關問題