2010-01-27 7 views
6

Supongamos que haev un archivo de vídeo:¿Cómo obtengo un tipo de contenido de un archivo en Python? (Con url ..)

http://mydomain.com/thevideofile.mp4

qué tengo la cabecera y el tipo de contenido de este archivo ¿Cómo? Con Python. Pero, no quiero descargar todo el archivo. quiero que vuelva:

video/mp4 

Editar: esto es lo que hice. ¿Qué piensas?

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

'urlopen (url)' descargará el archivo completo solo para obtener los encabezados. Una solución es usar una Solicitud personalizada que le dirá a urlopen que use HEAD para abrir la url en lugar de GET –

+1

Las pruebas de Furthur muestran que no se descarga todo el archivo, solo un fragmento arbitrario y la conexión permanece abierta hasta que 'f' se apaga de alcance: esto es un poco malvado para el servidor. –

Respuesta

12

así:

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

que sólo descargar e imprimir los encabezados porque está haciendo una petición HEAD:

Pide que la respuesta idéntica a la que le correspondería a una solicitud GET , pero sin la respuesta cuerpo. Esto es útil para recuperar la metainformación escrita en los encabezados de respuesta , sin tener que transportar todo el contenido.

(a través de Wikipedia)

+2

+1, sí, HEAD es de hecho el camino a seguir. –

+0

¿Hay algo malo con el mío? f = urllib2.urlopen (url) params ['mime'] = f.headers ['content-type'] – TIMEX

+0

@alex: sí, descargará todo el archivo. –

4

Esta es una respuesta nivel más alto que la de Brian. El uso de la maquinaria urllib tiene las ventajas habituales, como el manejo automático de redirecciones, etc.

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 
0

se puede obtener el tipo de vídeo utilizando el método de información() o las cabeceras dict

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

una prueba con un archivo AVI seleccionados al azar buscado en Google en la red que es más de 600 Mb

$ 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 

solo ocupará "ancho de banda" cuando el archivo se descargue realmente, es decir, se envían paquetes hacia y desde el socket.

+0

Eso descargará el archivo completo. –

+0

descargar el archivo completo? como en la descarga a local y entonces tengo un archivo físico real? No, no lo hará. Además, OP está preguntando qué le pasa a este método, así que le muestro dónde está equivocado. – ghostdog74

+0

Realizará una solicitud que ** descargará ** todo el archivo.Por supuesto, no se almacenará en su sistema de archivos, pero la solicitud bloqueará y desperdiciará ancho de banda * sin motivo *. –

Cuestiones relacionadas