2012-10-21 15 views
6

Chcę uzyskać wartość Content-Length ze zmiennej meta. Potrzebuję uzyskać rozmiar pliku, który chcę pobrać. Ale ostatnia linia zwraca błąd, obiekt HTTPMessage nie ma atrybutu getheaders.Pobierz rozmiar pliku z wartości "Content-Length" z pliku w pythonie 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]) 

Odpowiedz

9

Wygląda na to, że używasz Pythona 3 i przeczytałeś jakiś kod/dokumentację dla Pythona 2.x. Jest to słabo udokumentowane, ale w Pythonie 3 nie ma metody getheaders, a jedynie metodę get_all.

Zobacz this bug report.

+1

Dla ludzi z Google wygląda na to, że możesz teraz zrobić 'file_size = int (d.getheader ('Content-Length'))' w Pythonie 3 (testowane w 3.4.1). Wydaje się również, że 'd.getheaders()' został dodany. – freshtop

+2

@ freshtop: Zarówno 'd.getheader()' jak i 'd.getheaders()' działają nawet w Pythonie 3.2. Uwaga: OP używa tutaj 'd.info()' zamiast 'd'. 'd.info(). getheader()' i 'd.info(). getheaders()' jest kodem Python 2. Aby obsługiwać zarówno Python 2, jak i 3, można użyć ['d.headers ['Content-Length']'] (http://stackoverflow.com/a/31576222). – jfs

3

Należy rozważyć użycie Requests:

import requests 

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

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

dla Pythona 3, zastosowanie:

print(resp.headers['content-length']) 

zamiast.

+0

+1, Jeśli oczekujesz tylko jednego nagłówka, przejdź do operatora pozycji. Obawiam się jednak, że w Pythonie 3 nie ma żadnego atrybutu 'headers', więc prawdopodobnie powinien to być' resp.get ("Content-Length") 'lub może' resp ["Content-Length"] '(nie próbował tego) – Krumelur

+0

wydaje się nie być bibliotek żądań w python 3.2 ... myślę, że powinienem zmienić wersje ... której wersji używasz? – scandalous

+0

@skandaliczne 'Żądania' ostatnio dodano obsługę 3.3. Używam wersji 2.7.3. –

6

dla Content-Length:

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

dlaczego w dół, kiedy działa? – nickanor

+1

Myślę, że szukają rozwiązania Pythona3, (przynajmniej ja jestem i jest to najlepsze trafienie w Google). – ThorSummoner

+1

@ThorSummoner: 'd.getheader()' działa tylko na Pythonie 3. Pytanie ma znacznik Python-3.x, dlatego odpowiednie jest tylko rozwiązanie Python 3. – jfs

1

Zmień ostateczna linia:

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() 

Works z Pythona 3.x

1

response.headers['Content-Length'] działa zarówno Python 2 i 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

To nie działa, jeśli nagłówek się powtarza. Pierwszą dostajesz tylko przy użyciu atrybutu 'headers'. Jedynym * niezawodnym sposobem jest użycie 'info().get_all() '. W Python2 'info(). Get()' łączyłoby wszystkie zduplikowane nagłówki, ale to kruche zachowanie zostało usunięte dla Py3. Niestety, 'get_all()' nie zostało przeniesione do Py2, więc utknęliśmy w walce z tą słabo udokumentowaną biblioteką przez kolejne lata. –

+0

@KevinThibedeau: 1- [zduplikowane nagłówki Content-Length o różnych wartościach nie są obsługiwane w http] (https://tools.ietf.org/html/rfc7230#page-31) 2- 'info()' jest zaimplementowane jako 'return self.headers'. – jfs

+0

Z [RFC-6265] (https://tools.ietf.org/html/rfc6265#section-3): "Serwery Origin NIE POWINIEN składać wielu pól nagłówka Set-Cookie w jedno pole nagłówka". Nie jest niczym niezwykłym odbieranie zduplikowanych nagłówków. Biblioteki Pythona muszą odpowiednio wspierać to zachowanie. –