Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用urllib2。如何获取正在下载的文件的名称?_Python_Download_Default_Filenames_Urllib2 - Fatal编程技术网

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

在Python中使用urllib2。如何获取正在下载的文件的名称?,python,download,default,filenames,urllib2,Python,Download,Default,Filenames,Urllib2,我是python初学者。我正在使用urllib2下载文件。下载文件时,我会指定一个文件名,以便将下载的文件保存到硬盘上。但是,如果使用浏览器下载文件,则会自动提供默认文件名 以下是我的代码的简化版本: def downloadmp3(url): webFile = urllib2.urlopen(url) filename = 'temp.zip' localFile = open(filename, 'w') localFile.write(webFile.re

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

以下是我的代码的简化版本:

def downloadmp3(url):
    webFile = urllib2.urlopen(url)
    filename = 'temp.zip'
    localFile = open(filename, 'w')
    localFile.write(webFile.read())
该文件可以正常下载,但如果我在浏览器中键入变量“url”中存储的字符串,则在下载文件时会为该文件指定一个默认文件名。我想将此文件名用于我下载的文件,而不是“temp.zip”或我指定的任何文件名

如何使用urllib2(或其他一些Python库)将文件保存为我正在下载的服务器想要的文件名


如果有人不理解这个问题,请说出来,这样我可以试着说得更清楚。

服务器通常通过内容处置标题包含文件名:

content-disposition: attachment; filename=foo.pdf
您可以通过以下方式访问标题:

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']
result=urllib2.urlopen(…)
result.info()>>导入urllib2
ur>>>结果=urllib2.urlopen('http://zopyx.com')
>>>打印结果

但请注意,不需要显示此标题。否则,您需要根据请求的URL自己生成一个合理的名称-例如,从URI的最后一个组件。
在本例中使用Python的urlparse()方法。

您可以使用urlretrieve:


我遇到一个问题,服务器没有给我任何
内容处置
标题,所以如果这也是您的情况,您可以像这样从url提取文件名:

os.path.basename(urlparse.urlparse(file_url))
在我的例子中,我使用了包含文件扩展名的
file\u stream.headers.subtype
,并根据django的模型slug重命名了文件,下面是一个示例:

import urlparse, os

tmp_file = NamedTemporaryFile(delete=True)
file_stream = urllib2.urlopen(file_url)
tmp_file.write(file_stream.read())
tmp_file.flush()

new_file_name = "some_prefix_" + my_model.slug + "." + file_stream.headers.subtype
#You may prefer this:
# new_file_name = os.path.basename(urlparse.urlparse(file_url))

my_model.file.save(new_file_name, File(tmp_file))
最后一行是使用django的save方法保存文件,还通过在末尾添加随机字符来处理重复的文件名:)


太棒了。

我之前的回答的问题是,他们使用的是原始URL,如果重定向,这将失败。我是这样做的:(注意使用
result.url
而不是
url


有两个地方可以查找文件名:Content Disposition头字段和URL。使用cgi.parse_header()解析头字段。使用urlparse()/urlspit()和posixpath.basename()解析URL。有关示例,请参见此答案:
import os
import urllib2
result = urllib2.urlopen(url)
filename = os.path.basename(urllib2.urlparse.urlparse(result.url).path)