在Python中使用urllib2.如何获取我正在下载的文件的名称?

Dan*_*nny 5 python filenames default download urllib2

我是一个蟒蛇初学者.我正在使用urllib2下载文件.当我下载文件时,我指定了一个文件名,用于将下载的文件保存到我的硬盘上.但是,如果我使用浏览器下载文件,则会自动提供默认文件名.

这是我的代码的简化版本:

def downloadmp3(url):
    webFile = urllib2.urlopen(url)
    filename = 'temp.zip'
    localFile = open(filename, 'w')
    localFile.write(webFile.read())
Run Code Online (Sandbox Code Playgroud)

该文件下载得很好,但是如果我将存储在变量"url"中的字符串输入到我的浏览器中,则在下载文件时会给出该文件的默认文件名.我想为我下载的文件使用这个文件名而不是'temp.zip'或我分配给它的任何东西.

我如何使用urllib2(或其他一些Python库)来保存文件,其中包含我正在下载的服务器所需的文件名?

如果有人不理解这个问题,请说出来,以便我可以尝试使其更清楚.

小智 7

文件名通常由服务器通过content-disposition头包含:

content-disposition: attachment; filename=foo.pdf
Run Code Online (Sandbox Code Playgroud)

您可以访问标题

result = urllib2.urlopen(...)
result.info() <- contains the headers


i>>> import urllib2
ur>>> result = urllib2.urlopen('http://zopyx.com')
>>> print result
<addinfourl at 4302289808 whose fp = <socket._fileobject object at 0x1006dd5d0>>
>>> result.info()
<httplib.HTTPMessage instance at 0x1006fbab8>
>>> result.info().headers
['Date: Mon, 04 Apr 2011 02:08:28 GMT\r\n', 'Server: Zope/(unreleased version, python 2.4.6, linux2) ZServer/1.1 Plone/3.3.4\r\n', 'Content-Length: 15321\r\n', 'Content-Type: text/html; charset=utf-8\r\n', 'Via: 1.1 www.zopyx.com\r\n', 'Cache-Control: max-age=3600\r\n', 'Expires: Mon, 04 Apr 2011 03:08:28 GMT\r\n', 'Connection: close\r\n']
Run Code Online (Sandbox Code Playgroud)

看到

http://docs.python.org/library/urllib2.html

但请注意,此标头不需要存在.否则,您需要自己从请求的URL生成一个合理的名称 - 例如,从URI的最后一个组件.在这种情况下使用Python的urlparse()方法.