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

发布于 2024-10-30 01:25:22 字数 500 浏览 3 评论 0原文

我是一个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 库)以我下载的服务器想要的文件名保存文件?

如果有人不明白这个问题,请说出来,以便我可以尽力说得更清楚。

I am a python beginner. I am using urllib2 to download files. When I download a file, I specify a filename to with which to save the downloaded file on my hard drive. However, if I download the file using my browser, a default filename is automatically provided.

Here is a simplified version of my code:

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

The file downloads just fine, but if I type the string stored in the variable "url" into my browser, there is a default filename given to the file when I download it. I want to use this filename for my downloaded file not 'temp.zip' or whatever I assign it.

How do I use urllib2 (or some other Python library) to save the file with the filename that the server I am downloading from intends it to have?

If anyone doesn't understand this question, please say so, so that I can try to make it clearer.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

那伤。 2024-11-06 01:25:22

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

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']

您可以通过查看

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

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

The filename is usually included by the server through the content-disposition header:

content-disposition: attachment; filename=foo.pdf

You have access to the headers through

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']

See

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

But be aware that this header does not need to be present. Otherwise you need to generate a reasonable name yourself from the URL requested - e.g. from the last component of the URI.
Use the urlparse() method of Python in this case.

沙沙粒小 2024-11-06 01:25:22

我对之前答案的问题是他们使用的是原始 URL,在重定向的情况下会失败。我是这样做的:(注意使用 result.url 而不是 url

import os
import urllib2
result = urllib2.urlopen(url)
filename = os.path.basename(urllib2.urlparse.urlparse(result.url).path)

My issue with the previous answers is that they were using the original URL, and that would fail in the case of a redirect. Here's how I do it: (note the use of result.url instead of url)

import os
import urllib2
result = urllib2.urlopen(url)
filename = os.path.basename(urllib2.urlparse.urlparse(result.url).path)
青萝楚歌 2024-11-06 01:25:22

您可以使用 urlretrieve 来做到这一点:

http://docs.python.org/library/urllib.html< /a>

You can do that using urlretrieve :

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

<逆流佳人身旁 2024-11-06 01:25:22

我遇到了一个问题,服务器没有给我任何 content-disposition 标头,因此如果这也是您的情况,您可以像这样从 url 中提取文件名:

os.path.basename(urlparse.urlparse(file_url))

在我的情况下,我使用 file_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 方法保存文件,还通过在末尾添加随机字符来处理重复的文件名:)

太棒了。

I had an issue where server did not give me any content-disposition header so if it's also your case, you can extract filename from url like this:

os.path.basename(urlparse.urlparse(file_url))

In my case, I used file_stream.headers.subtype which contained file extension and I renamed files based on my django's model slug, here's an example:

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))

Last line is saving file using django's save method, also handling duplicated file names by adding random characters at the end :)

Awesome.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文