如何在Python中获取文件的内容类型?(附网址)
假设我有一个视频文件: 如何获取此文件的标题和内容类型?使用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.
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
时,它会占用带宽。