2010-01-27 11 views
6

मान लीजिए मैं एक वीडियो फ़ाइल haev:मैं पाइथन में एक फ़ाइल प्रकार की सामग्री कैसे प्राप्त करूं? (साथ यूआरएल ..)

http://mydomain.com/thevideofile.mp4

मैं कैसे शीर्षक और इस फाइल की सामग्री प्रकार मिलता है? पायथन के साथ। लेकिन, मैं पूरी फाइल डाउनलोड नहीं करना चाहता हूं। मैं इसे वापस करना चाहते:

video/mp4 

संपादित करें: यह मैं क्या किया है। तुम क्या सोचते हो?

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

'urlopen (url) 'हेडर प्राप्त करने के लिए पूरी फ़ाइल डाउनलोड करेगा। एक समाधान एक अनुकूलित अनुरोध का उपयोग करना है जो यूआरएलओपीएन को यूईएल को –

+1

प्राप्त करने के बजाय यूआरएल खोलने के लिए बताएगा फुरथुर परीक्षण से पता चलता है कि पूरी फाइल डाउनलोड नहीं की गई है, सिर्फ एक मनमानी आकार का हिस्सा है और कनेक्शन तब तक खुला रहता है जब तक 'f' बाहर नहीं जाता दायरे का - यह सर्वर से करने के लिए एक बुरा काम है। –

उत्तर

12

तो जैसा:

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

यह केवल डाउनलोड करने और हेडर प्रिंट होगा क्योंकि यह एक HEAD अनुरोध कर रही है:

प्रतिक्रिया एक है कि अनुरूप होगा के समान के लिए पूछते हैं अनुरोध प्राप्त करने के लिए, लेकिन प्रतिक्रिया के बिना शरीर। यह प्रतिक्रिया हेडर में लिखित मेटा-सूचना को पुनर्प्राप्त करने के लिए उपयोगी है, बिना पूरे सामग्री परिवहन के।

(Wikipedia के माध्यम से)

+2

+1, हाँ, हेड वास्तव में जाने का रास्ता है। –

+0

क्या मेरे साथ कुछ गलत है? f = urllib2.urlopen (url) पैराम्स ['माइम'] = f.headers ['content-type'] – TIMEX

+0

@alex: हाँ, यह पूरी फ़ाइल डाउनलोड करेगा। –

4

यह ब्रायन की तुलना में एक उच्च स्तर जवाब है। 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 
0

आप की जानकारी() पद्धति का उपयोग करके वीडियो प्रकार प्राप्त कर सकते हैं या हेडर

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

एक बेतरतीब ढंग से चुना avi शुद्ध है कि पर googled फ़ाइल के साथ एक परीक्षण रन dict 600MB

की तुलना में अधिक
$ 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 

फ़ाइल वास्तव में डाउनलोड होने पर ही "बैंडविड्थ लेना" होगा, यानी पैकेट को सॉकेट से भेजा जा रहा है।

+0

वह पूरी फाइल डाउनलोड करेगा। –

+0

पूरी फाइल डाउनलोड करें? जैसा स्थानीय में डाउनलोड है और इसलिए मेरे पास वास्तविक भौतिक फ़ाइल है? नहीं, यह नहीं होगा। इसके अलावा, ओपी पूछ रहा है कि इस विधि के साथ क्या गलत है, इसलिए मैं उसे दिखा रहा हूं कि वह कहां गलत है। – ghostdog74

+0

यह एक अनुरोध करेगा जो ** ** पूरी फ़ाइल डाउनलोड करेगा।बेशक यह आपके फाइल सिस्टम में संग्रहीत नहीं किया जाएगा लेकिन अनुरोध * किसी कारण * के लिए बैंडविड्थ को अवरुद्ध और बर्बाद कर देगा। –

संबंधित मुद्दे

 संबंधित मुद्दे