2009-12-30 4 views
2

파이썬을 사용하여 웹 서버에서 zip 파일을 프로그래밍 방식으로 다운로드하고 있습니다. 웹 브라우저를 사용하면 좋습니다. 이 부분 스크립트를 작성했습니다.바이너리 데이터에 대해 Urlllib2.urlopen을 사용할 수 없습니까?

response = urllib2.urlopen(url, data, 10) 
the_page = response.read() 
f = open(filename, 'w') 
f.write(the_page) 
f.close() 

요청이 성공하고 데이터를받습니다. 문제는 내가 다운로드하는 파일 (zip 파일)이 작동하지 않는다는 것입니다. 파일이 손상된 것 같습니다. 그것은 길이의 오른쪽 일종의 것으로 보인다 및 텍스트 편집기에서 보았다 압축 파일 내용처럼 보입니다. 다음은 다운로드 한 헤더입니다.

콘텐츠 길이 : 9891 콘텐츠 - 처리 : 콘텐츠 - 처리 : 첨부 파일; 파일 이름 = "TrunkBackup_201.zip" 날짜 : 2009년 12월 30일 (수) 그리니치 표준시 12시 22분 8초 수락 - 범위 : 나는 응답의 길이를 확인하면 바이트는

, 내가 무슨 일이 일어나고 있는지 의심 9891.에서 정확 내가 response.read()이라고 부를 때 그 결과는 '유용하게'정규화 된 캐리지 리턴 문자열 (예 : \r ~ \n)입니다. 파일을 쓸 때 이진 데이터가 약간 잘못되어 zip 파일이 손상되었습니다.

내 문제는 (A) 내가 옳은지 잘 모르겠다. (B) 내가 옳은지 어떻게 바이너리 데이터를 저장 하는가? 바이너리 모드로 파일을 열

+1

파일을 이진 모드로 열 때 작동합니까 ('open (filename, 'wb')')? –

답변

9

시도 :

f = open(filename, 'wb') 
1

당신은 원시 이진 파일을 다운로드하기위한 urlretrieve function을 사용할 수 있습니다.

+0

urlretrieve에 문제가있었습니다. 앱이 방금 중지되었습니다. 왜 몰라. –

+0

그건 궁금해서 ... 나는 urlretrieve (url, targetpath)가 파일에서 잘 동작한다고 생각한다. (아마도 "url-> string-> file"보다 훨씬 빠르다.) 아마 당신이 나에게 당신의 코드를 보여줄 수 있습니다. – 3lectrologos

0

쓰기 모드가 "wb"로 설정된 경우에도 동일한 오류가 발생하는 경우 파일 작업을 시도하기 전에 "f.flush()"또는 "f.close()"를 호출해야합니다. 그렇지 않으면 완전히 쓰여지지 않을 수 있습니다.

관련 문제