2009-12-30 46 views
2

我使用python以編程方式從Web服務器下載zip文件。使用網絡瀏覽器,沒問題。我寫了這個(部分)腳本;對二進制數據使用Urlllib2.urlopen失敗?

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

請求成功,我得到數據。問題是我正在下載的文件 - 一個zip文件 - 不起作用;該文件似乎已損壞。它似乎是正確的長度,並且在文本編輯器中看起來看起來像一個zip文件內容。這裏是下載的標題;

Content-Length:9891 Content-Disposition:Content-Disposition:attachment;文件名=「TrunkBackup_201.zip」 日期:星期三,2009年12月30日12:22:08 GMT 接受-範圍:字節

當我檢查響應的長度,它是正確的,在9891.我懷疑發生了什麼當我撥打response.read()時,結果是一個字符串,其回車符'有用'歸一化(例如,\r\n)。當我編寫文件時,二進制數據有點不對,並且zip文件已損壞。我的問題是(A)我不確定我是否正確,(B)如果我是正確的,如何保存二進制數據本身?

+1

當你以二進制模式打開文件('open(filename,'wb')')時它工作嗎? – 2009-12-30 12:29:41

回答

9

嘗試以二進制方式打開文件:

f = open(filename, 'wb') 
1

您可以使用urlretrieve function下載原始二進制文件。

+0

我與urlretrieve有問題 - 我的應用剛剛停止。不知道爲什麼。 – 2009-12-30 15:59:23

+0

這很好奇......我認爲urlretrieve(url,targetpath)對文件工作正常(可能比「url-> string-> file」方式快得多)。也許你可以告訴我你的代碼。 – 3lectrologos 2009-12-30 23:31:10

0

如果有人甚至在寫模式設置爲「wb」時也遇到同樣的錯誤,請確保在嘗試使用該文件之前調用「f.flush()」或「f.close()」否則可能不會完全寫入。