2012-07-14 5 views
2

나는 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 import ftp'에서 그것은 올바르게 작동합니다. –

+0

"block"(제공된 코드에 표시되지 않은 값이 있음)이라는 변수는 문자열이 아닌 파일 객체로 간주됩니다 (상당히 명확합니다). 더 많은 코드를 포함하면 더 많은 도움을 드릴 수 있습니다. – alexy13

답변

2

나는이에게 자신을 재현 할 수없는,하지만 난 무슨 일이 일어나고 있는지의 아이디어가 - 난 그냥 이 일어나는 방법을 모르겠어요. 누군가가 전화를 걸 수 있기를 바랍니다. file은 handleDownload에 전달되지 않으며 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 

같은 것을 쓸 수있는 반환 올바른 파일에서 가리키는 기능. 그 후,

도 작동해야합니다.

+0

새로운 기능이 추가 된 두 번째 솔루션은 저에게 도움이되었습니다. 필자가 작성하고자하는 디렉토리를 file = open (filename, 'wb')에 추가해야했습니다. 첫 번째 해결책도 효과가 있었지만 다운로드 한 파일을 검사했을 때 파일이 손상되어 다운로드중인 파일이 너무 커서 개별 비트로 다운로드 할 수 없었습니다. 도움 주셔서 대단히 감사합니다. –

+0

안녕하세요, 귀하의 답변을 읽고, 나는 onftp = FTP ('도메인 이름') 파일에 쓰려고합니다. >>> ftp.login ('user', 'pass') >>> file11 = open ('CallXml .xml ','w ') >>> file11.write ('Hello World ') >>> file11.write (여기'xyz 여기 ') >>> file11.write (' 모두 ') >>> file11.close() >>> file11 = open ('CallXml.xml ','r ') content = file11.read() 인쇄 내용 올바른 내용을 인쇄하지만 godaddy에 로그인 할 때 파일이 업데이트되지 않았는지 확인하십시오. 왜 godaddy 서버에 파일이 업데이트되지 않는지 알려주세요. – GoGreen