2012-10-21 23 views
6

में फ़ाइल से "सामग्री-लंबाई" मान से फ़ाइल का आकार प्राप्त करें I मेटा चर से Content-Length मान प्राप्त करना चाहते हैं। मुझे उस फ़ाइल का आकार प्राप्त करने की आवश्यकता है जिसे मैं डाउनलोड करना चाहता हूं। लेकिन अंतिम पंक्ति एक त्रुटि देता है, HTTPMessage ऑब्जेक्ट में कोई विशेषता नहीं है getheadersपायथन 3.2

import urllib.request 
import http.client 

#----HTTP HANDLING PART---- 
url = "http://client.akamai.com/install/test-objects/10MB.bin" 

file_name = url.split('/')[-1] 
d = urllib.request.urlopen(url) 
f = open(file_name, 'wb') 

#----GET FILE SIZE---- 
meta = d.info() 

print ("Download Details", meta) 
file_size = int(meta.getheaders("Content-Length")[0]) 

उत्तर

9

ऐसा लगता है कि आप पाइथन 3 का उपयोग कर रहे हैं, और पाइथन 2.x के लिए कुछ कोड/दस्तावेज पढ़ चुके हैं। यह खराब दस्तावेज है, लेकिन पाइथन 3 में getheaders विधि नहीं है, लेकिन केवल get_all विधि है।

this bug report देखें।

+1

Google के लोगों के लाभ के लिए, ऐसा लगता है कि अब आप पाइथन 3 (3.4.1 में परीक्षण) में 'file_size = int (d.getheader (' content-length ')) कर सकते हैं। 'd.getheaders() 'भी जोड़ा गया है। – freshtop

+2

@ फ्रेशटॉप: दोनों 'डी .getheader() 'और' d.getheaders()' पायथन 3.2 पर भी काम करते हैं। नोट: ओपी 'd' के बजाय' d.info() 'का उपयोग करता है। 'd.info()। getheader()' और 'd.info()। getheaders()' पायथन 2 कोड है। पायथन 2 और 3 दोनों का समर्थन करने के लिए, ['d.headers ['सामग्री-लंबाई']' का उपयोग किया जा सकता है] (http://stackoverflow.com/a/31576222)। – jfs

3

आप Requests उपयोग करने पर विचार करना चाहिए:

import requests 

url = "http://client.akamai.com/install/test-objects/10MB.bin" 
resp = requests.get(url) 

print resp.headers['content-length'] 
# '10485760' 

अजगर 3 के लिए, उपयोग करें:

print(resp.headers['content-length']) 
बजाय

+0

+1, यदि आप केवल एक शीर्षलेख की अपेक्षा करते हैं, तो आइटम ऑपरेटर के साथ जाएं। हालांकि, मुझे डर है कि Python3 में कोई 'हेडर' विशेषता नहीं है, इसलिए शायद यह 'resp.get ("सामग्री-लंबाई") हो सकता है या शायद' resp ["सामग्री-लंबाई"] '(यह कोशिश नहीं की गई) – Krumelur

+0

पाइथन 3.2 में कोई अनुरोध पुस्तकालय नहीं लगता है ... मुझे लगता है कि मुझे संस्करणों को स्विच करना चाहिए ... आप किस संस्करण का उपयोग कर रहे हैं? – scandalous

+0

@ सशक्त 'अनुरोध' ने हाल ही में 3.3 समर्थन जोड़ा। मैं 2.7.3 चल रहा हूँ। –

6
Content-Length के लिए

:

file_size = int(d.getheader('Content-Length')) 
+0

क्यों काम कर रहा है जब डाउनवोट? – nickanor

+1

मुझे लगता है कि वे एक पायथन 3 समाधान की तलाश में हैं, (कम से कम मैं हूं और यह शीर्ष Google हिट है) – ThorSummoner

+1

@ThorSummoner: 'd.getheader() 'केवल पायथन 3 पर काम करता है। प्रश्न में पायथन-3.x टैग है और इसलिए पायथन 3 केवल समाधान उपयुक्त है। – jfs

1

बदलें अंतिम पंक्ति रहे हैं: अजगर 3.x के साथ

file_size = int(meta.get_all("Content-Length")[0]) 
0
import urllib.request 

link = "<url here>" 

f = urllib.request.urlopen(link) 
meta = f.info() 
print (meta.get("Content-length")) 
f.close() 

वर्क्स

1

response.headers['Content-Length'] दोनों अजगर 2 और 3 पर काम करता है:

#!/usr/bin/env python 
from contextlib import closing 

try: 
    from urllib2 import urlopen 
except ImportError: # Python 3 
    from urllib.request import urlopen 


with closing(urlopen('http://stackoverflow.com/q/12996274')) as response: 
    print("File size: " + response.headers['Content-Length']) 
+0

यदि कोई हेडर दोहराया जाता है तो यह काम नहीं करता है। 'हेडर' विशेषता का उपयोग करते समय आपको केवल पहला मिलता है। * केवल * विश्वसनीय तरीका 'जानकारी() का उपयोग करना है।get_all() '। पायथन 2 'जानकारी() में।() 'सभी डुप्लिकेट हेडर को जोड़ देगा लेकिन यह नाजुक व्यवहार Py3 के लिए हटा दिया गया है। दुर्भाग्य से 'get_all()' को पी 2 में वापस नहीं भेजा गया है, इसलिए हम आने वाले वर्षों के लिए इस खराब दस्तावेज लाइब्रेरी के साथ कुश्ती करने के लिए फंस गए हैं। –

+0

@ केविन टिब्बेडेउ: 1- [विभिन्न मानों के साथ डुप्लिकेट सामग्री-लंबाई शीर्षलेख http में समर्थित नहीं हैं] (https://tools.ietf.org/html/rfc7230#page-31) 2- 'जानकारी()' को लागू किया गया है 'रिटर्न self.headers'। – jfs

+0

[आरएफसी -6265] से (https://tools.ietf.org/html/rfc6265#section-3): "मूल सर्वर एकाधिक सेट-कुकी शीर्षलेख फ़ील्ड को एक ही शीर्ष फ़ील्ड में नहीं फोल्ड करना चाहिए"। डुप्लिकेट हेडर प्राप्त करना बिल्कुल असामान्य नहीं है। पायथन की पुस्तकालयों को इस व्यवहार को सही तरीके से समर्थन करने की आवश्यकता है। –