2012-10-21 11 views
6

Content-Lengthの値をメタ変数から取得します。私はダウンロードしたいファイルのサイズを取得する必要があります。しかし最後の行はエラーを返します。HTTPMessageオブジェクトには属性がありませんgetheaderspythonのファイルから "Content-Length"の値を取得します。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

Python 3を使用しているようですが、Python 2.xのコードやドキュメントを読んでいるようです。文書化されていませんが、getheadersメソッドはPython 3ではなく、get_allメソッドのみです。

this bug reportを参照してください。 Content-Lengthため

+1

Googleの人々の利益のために、Python 3で 'file_size = int(d.getheader( 'Content-Length'))'を実行できるようになりました(3.4.1でテスト済み)。 'd.getheaders()'も追加されたようです。 – freshtop

+2

@freshtop: 'd.getheader()'と 'd.getheaders()'はどちらもPython 3.2でも動作します。注意:OPはここで 'd'の代​​わりに' d.info() 'を使います。 'd.info().getheader()'と 'd.info()。getheaders()'はPython 2のコードです。 Python 2とPython 3の両方をサポートするには、 '' d.headers ['Content-Length'] 'を使うことができます。](http://stackoverflow.com/a/31576222)。 – jfs

3

あなたはRequestsの使用を検討してください:Pythonの3のために

import requests 

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

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

、使用:代わりに

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

+0

+1、ヘッダーが1つしかない場合は、アイテム演算子を使用してください。しかし、私はPython3に 'headers'属性がないことを恐れているので、' resp.get( "Content-Length") 'あるいは' resp ["Content-Length"] ' – Krumelur

+0

python 3.2では要求ライブラリがないようです...私はバージョンを切り替える必要があると思います...どのバージョンを使用していますか? – scandalous

+0

@Scandalous 'Requests'は最近3.3サポートを追加しました。私は2.7.3を走っています。 –

6

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

なぜそれが働いているときにdownvote? – nickanor

+1

私は彼らがpython3のソリューションを探していると思います。(少なくとも私はこれがトップのGoogleヒットです) – ThorSummoner

+1

@ThorSummoner: 'd.getheader()'はPython 3でのみ動作します。質問にはpython-3.xタグがあるため、Python 3のみの解決策が適切です。 – jfs

1

変更最終ラインへ:

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

のpython 3.xの持つ作品のPython 2と3の両方で

1

response.headers['Content-Length']作品:

#!/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

ヘッダーが繰り返されている場合、これは機能しません。 'headers'属性を使うときは、最初のものだけを取得します。 *唯一信頼できる方法は 'info()を使うことです。get_all() ' Python2では 'info().get()'はすべての重複ヘッダを連結しますが、この脆弱な動作はPy3では削除されています。残念なことに 'get_all()'はPy2にバックポートされていないので、私たちはこの文書化されていないこの図書館に長年取り組まなくてはなりません。 –

+0

@KevinThibedeau:1 - [値が異なる重複したContent-Lengthヘッダーはhttpではサポートされていません](https://tools.ietf.org/html/rfc7230#page-31)2- 'info()'は次のように実装されています。 'return self.headers'です。 – jfs

+0

[RFC-6265](https://tools.ietf.org/html/rfc6265#section-3): "オリジナルサーバは複数のSet-Cookieヘッダーフィールドを単一のヘッダーフィールドに折りたたんではならない(SHOULD NOT)"。重複したヘッダーを受け取ることはまれではありません。 Pythonのライブラリはこの動作を適切にサポートする必要があります。 –

関連する問題