如何使用Python下载一个tarball?

3

我正在尝试通过下载内容并将其写入文件来下载tarball。这基本上是我的代码如何工作的:

from urllib import urlretrieve

contents = urlretrieve('http://example.com/file.tgz')
open('/tmp/my-tar.tgz', 'w').write(contents)

然而,当我这样做时,我会收到一个错误(TypeError),该错误指出在调用write时,需要一个字符缓冲区对象。

我应该如何将tarball的内容写入文件?


Python 版本是多少? - cubuspl42
1
如果以wb模式而不是w模式打开/tmp/my-tar.tgz会发生什么? - MattDMo
urlretrieve 不是返回一个元组 (文件名, 头信息) 吗?... - cubuspl42
实际上,这个问题是一个重复的问题,可在https://dev59.com/yXVD5IYBdhLWcg3wTZxm找到答案。 - cubuspl42
1个回答

4

文档中提到::

urllib.urlretrieve(url[, filename[, reporthook[, data]]])

如果需要,将由URL指定的网络对象复制到本地文件。如果该URL指向本地文件或有效的缓存副本,则不会复制该对象。返回一个元组(filename,headers),其中filename是可以找到该对象的本地文件名,而headers是urlopen()返回的对象的info()方法返回的任何信息(对于远程对象,可能已缓存)。异常与urlopen()相同。

write 抱怨,因为它希望得到你要写入内容的内容,但实际上它拿到的是一个 (filename,headers)���组。

修正版本:

from urllib import urlretrieve

filename, headers = urlretrieve('http://example.com/file.tgz', '/tmp/my-tar.tgz')

1
“contents” 是一个 (文件名,头部) 元组的名称?这不是误导吗? - cubuspl42
@cubuspl42 是的,已经修复了。 - Nick ODell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接