Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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中获取文件的内容类型?(附网址)_Python_Http_Url_Content Type - Fatal编程技术网

如何在Python中获取文件的内容类型?(附网址)

如何在Python中获取文件的内容类型?(附网址),python,http,url,content-type,Python,Http,Url,Content Type,假设我有一个视频文件: 如何获取此文件的标题和内容类型?使用Python。但是,我不想下载整个文件。 我希望它能返回: video/mp4 编辑:这就是我所做的。你觉得怎么样 f = urllib2.urlopen(url) params['mime'] = f.headers['content-type'] 像这样: >>> import httplib >>> conn = httplib.HTTPConnection("mydomain.

假设我有一个视频文件:

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

video/mp4
编辑:这就是我所做的。你觉得怎么样

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

>>> import httplib
>>> conn = httplib.HTTPConnection("mydomain.com")
>>> conn.request("HEAD", "/thevideofile.mp4")
>>> res = conn.getresponse()
>>> print res.getheaders()
这将只下载并打印标题,因为它正在发出请求:

请求与GET对应的响应相同的响应 请求,但没有响应 身体。这对于检索 作为回应的元信息 头,无需运输 全部内容


(via)

这是一个比布赖恩更高层次的答案。使用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

您可以使用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

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

我的有什么问题吗?f=urllib2.urlopen(url)params['mime']=f.headers['content-type']@alex:是的,它将下载整个文件。请重新措辞。它不会下载整个文件。我已经用ettercap做了一些测试。HEAD请求下载大约400字节,alex建议的方式是下载文件的前80k左右,并保持连接悬空。
urlopen(url)
将下载整个文件以获取标题。一种解决方案是使用定制请求,该请求将告诉urlopen使用HEAD来打开url,而不是GETFurthur测试显示整个文件未下载,只要一个任意大小的块,连接就会保持打开状态,直到
f
超出范围-这对服务器来说是一件有点邪恶的事情。这会下载整个文件。下载整个文件?就像在下载到本地,所以我有一个实际的物理文件?不,不会的。此外,OP会问这个方法有什么问题,所以我会告诉他哪里错了。它会发出一个请求,下载整个文件。当然,它不会存储到文件系统中,但是请求会无缘无故地阻塞和浪费带宽。如果读取文档,urlopen将返回一个类似文件的对象。这就是为什么您可以执行诸如response.read()之类的操作。只有当你读到()的时候,“带宽被浪费了”,试试看。下载类似的内容,并查看请求在活动REPL中的下载量
urlopen
阻塞,直到它获得标题和
Content Length
,因此它看起来可能是即时的,但实际上是在后台下载内容。当您阅读时,Python会为内容阻塞。因此,当您在后台调用
urlopen
时,它会占用带宽。