【问题标题】:How do I get a content-type of a file in Python? (with url..)如何在 Python 中获取文件的内容类型? (带网址..)
【发布时间】:2010-01-27 00:08:59
【问题描述】:

假设我有一个视频文件:

http://mydomain.com/thevideofile.mp4

如何获取此文件的标题和内容类型?使用 Python。但是,我不想下载整个文件。 我希望它返回:

video/mp4

编辑:这就是我所做的。你怎么看?

f = urllib2.urlopen(url)
    params['mime'] =  f.headers['content-type']

【问题讨论】:

  • urlopen(url) 将下载整个文件以获取标题。一种解决方案是使用自定义请求,它会告诉 urlopen 使用 HEAD 打开 url 而不是 GET
  • 进一步的测试表明整个文件没有被下载,只是一个任意大小的块并且连接保持打开直到f超出范围 - 这对服务器。

标签: python http url content-type


【解决方案1】:

像这样:

>>> import httplib
>>> conn = httplib.HTTPConnection("mydomain.com")
>>> conn.request("HEAD", "/thevideofile.mp4")
>>> res = conn.getresponse()
>>> print res.getheaders()

这只会下载和打印标题,因为它正在发出HEAD 请求:

请求与对应于 GET 的响应相同的响应 请求,但没有响应 身体。这对于检索很有用 响应写入的元信息 标头,无需传输 全部内容。

(通过Wikipedia

【讨论】:

  • 我的有什么问题吗? f = urllib2.urlopen(url) 参数['mime'] = f.headers['content-type']
  • @alex:是的,它会下载整个文件。
  • 请改写。它不会下载整个文件。
  • 我用 ettercap 做了一些测试。 HEAD 请求下载大约 400 字节,alex 建议下载文件的前 80k 左右并使连接悬空。
【解决方案2】:

这是比布赖恩更高级别的答案。使用 urllib 机制具有通常的优点,例如自动处理重定向等。

import urllib2

class HeadRequest(urllib2.Request):
    def get_method(self):
        return "HEAD"

url = "http://mydomain.com/thevideofile.mp4"
head = urllib2.urlopen(HeadRequest(url))
head.read()          # This will return empty string and closes the connection
print head.headers.maintype
print head.headers.subtype
print head.headers.type

【讨论】:

    【解决方案3】:

    您可以使用 info() 方法或 headers dict 获取视频类型

    f=urllib2.urlopen(url)
    print f.headers['Content-Type']
    print f.info()
    

    在网上随机选择一个超过 600Mb 的 avi 文件进行测试运行

    $ cat test.py
    #!/usr/bin/env python
    import urllib2
    url="http://www.merseypirates.com/rjnsteve/rjnsteve/oem16.avi"
    f=urllib2.urlopen(url)
    print f.headers['Content-Type']
    
    $ time python test.py
    video/x-msvideo
    
    real    0m4.931s
    user    0m0.115s
    sys     0m0.042s
    

    它只会在实际下载文件时“占用带宽”,即数据包被发送到套接字或从套接字发送。

    【讨论】:

    • 这将下载整个文件。
    • 下载整个文件?就像下载到本地一样,所以我有一个实际的物理文件?不,不会的。此外,OP 在问这种方法有什么问题,所以我向他展示了他哪里错了。
    • 它将发出一个下载整个文件的请求。当然,它不会存储到您的文件系统,但请求会阻塞并浪费带宽,无缘无故
    • 不,不会的。如果您阅读文档, urlopen 会返回一个类似对象的文件。这就是为什么你可以做像 response.read() 这样的事情。只有当您 read() 时才会“浪费带宽”
    • 试试看。下载类似charlesproxy.com 的内容,然后查看请求在活动 REPL 中下载了多少。 urlopen 阻塞,直到它获得标题和 Content-Length 所以它可能 似乎 即时,但它实际上是在后台下载内容。当您read 时,Python 会阻止内容。所以当你调用urlopen它会占用带宽 - 只是在后台
    猜你喜欢
    • 2012-08-10
    • 2010-11-16
    • 1970-01-01
    • 2017-08-18
    • 2012-06-20
    • 1970-01-01
    • 2011-05-27
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多