2009-12-30 43 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()”否则可能不会完全写入。