使用Urllib2.urlopen处理二进制数据失败?

2 投票
3 回答
3527 浏览
提问于 2025-04-15 17:29

我正在用Python编写程序,从一个网络服务器上下载一个zip文件。用网页浏览器下载没问题。我写了这个(部分)脚本;

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: attachment; filename="TrunkBackup_20101230.zip"
Date: Wed, 30 Dec 2009 12:22:08 GMT
Accept-Ranges: bytes

当我检查响应的长度时,确实是9891。我怀疑发生的情况是,当我调用 response.read() 时,得到的结果是一个字符串,其中的回车符被“友好地”转换了(比如,\r 被转成了 \n)。这样在写入文件时,二进制数据就会稍微出错,导致zip文件损坏。

我面临的问题是(A)我不确定自己是否正确,(B)如果我没错,应该如何保存二进制数据本身呢?

3 个回答

0

如果有人在使用写入模式“wb”时遇到同样的错误,请确保在尝试操作文件之前调用“f.flush()”或“f.close()”。否则,文件可能没有完全写入。

1

你可以使用 urlretrieve 函数 来下载原始的二进制文件。

9

试着以二进制模式打开文件:

 f = open(filename, 'wb')

撰写回答