2012-10-21 40 views
6

Tôi muốn nhận giá trị Content-Length từ biến meta. Tôi cần phải nhận được kích thước của tập tin mà tôi muốn tải về. Nhưng dòng cuối cùng trả về lỗi, đối tượng HTTPMessage không có thuộc tính getheaders.Lấy kích thước tệp từ giá trị "Độ dài nội dung" từ tệp trong python 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]) 

Trả lời

9

Dường như bạn đang sử dụng Python 3 và đã đọc một số mã/tài liệu cho Python 2.x. Tài liệu này kém tài liệu, nhưng không có phương pháp getheaders trong Python 3, nhưng chỉ có phương thức get_all.

Xem this bug report.

+1

Vì lợi ích của mọi người từ Google, có vẻ như bây giờ bạn có thể làm 'file_size = int (d.getheader ('Content-Length'))' trong Python 3 (được thử nghiệm trong 3.4.1). 'd.getheaders()' cũng dường như đã được thêm vào. – freshtop

+2

@freshtop: Cả hai công cụ 'd.getheader()' và 'd.getheaders()' đều hoạt động ngay cả trên Python 3.2. Lưu ý: OP sử dụng 'd.info()' thay vì 'd' tại đây. 'd.info(). getheader()' và 'd.info(). getheaders()' là mã Python 2. Để hỗ trợ cả Python 2 và 3, ['d.headers ['Content-Length']' có thể được sử dụng] (http://stackoverflow.com/a/31576222). – jfs

3

Bạn nên xem xét sử dụng Requests:

import requests 

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

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

Đối với Python 3, sử dụng:

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

để thay thế.

+0

+1, Nếu bạn chỉ mong đợi một tiêu đề, hãy đi với toán tử mục. Tuy nhiên, tôi lo sợ không có thuộc tính 'header' trong Python3, vì vậy nó có thể là' resp.get ("Content-Length") 'hoặc có thể' resp ["Content-Length"] '(không thử cái này) – Krumelur

+0

dường như không có thư viện yêu cầu trong python 3.2 ... nghĩ rằng tôi nên chuyển đổi phiên bản ... phiên bản nào bạn sử dụng? – scandalous

+0

@ tai tiếng 'Yêu cầu' gần đây đã thêm hỗ trợ 3.3. Tôi đang chạy 2.7.3. –

6

cho Content-Length:

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

tại sao downvote khi nó hoạt động? – nickanor

+1

Tôi nghĩ rằng họ đang tìm kiếm một giải pháp python3, (ít nhất là tôi và đây là hit google hàng đầu) – ThorSummoner

+1

@ThorSummoner: 'd.getheader()' chỉ hoạt động trên Python 3. Câu hỏi có tag python-3.x và do đó Python 3 chỉ là giải pháp thích hợp. – jfs

1

Thay đổi dòng cuối cùng để:

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

trình với trăn 3.x

1

response.headers['Content-Length'] công trình trên cả hai Python 2 và 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

Điều này không hoạt động nếu một tiêu đề được lặp lại. Bạn chỉ nhận được cái đầu tiên khi sử dụng thuộc tính 'headers'. Cách duy nhất * * đáng tin cậy là sử dụng 'info().get_all() '. Trong Python2 'info(). Get()' sẽ nối tất cả các tiêu đề trùng lặp nhưng hành vi mong manh này đã bị loại bỏ cho Py3. Thật không may 'get_all()' đã không được backported để Py2 vì vậy chúng tôi đang bị mắc kẹt phải vật lộn với thư viện tài liệu kém này trong nhiều năm tới. –

+0

@KevinThibedeau: 1- [tiêu đề nội dung có độ dài nội dung trùng lặp với các giá trị khác nhau không được hỗ trợ trong http] (https://tools.ietf.org/html/rfc7230#page-31) 2- 'info()' được triển khai dưới dạng 'return self.headers'. – jfs

+0

Từ [RFC-6265] (https://tools.ietf.org/html/rfc6265#section-3): "Máy chủ gốc KHÔNG được gấp nhiều trường tiêu đề Đặt cookie thành một trường tiêu đề duy nhất". Nó không phải là ở tất cả các bất thường để nhận tiêu đề trùng lặp. Thư viện của Python cần hỗ trợ hành vi này đúng cách. –

Các vấn đề liên quan