2010-01-27 36 views
6

Giả sử tôi haev một file video:Làm cách nào để lấy một loại nội dung của một tệp bằng Python? (Với url ..)

http://mydomain.com/thevideofile.mp4

Làm thế nào để có được tiêu đề và nội dung kiểu của tập tin này? Với Python. Nhưng, tôi không muốn tải xuống toàn bộ tệp. tôi muốn trả lại:

video/mp4 

Chỉnh sửa: đây là những gì tôi đã làm. Bạn nghĩ sao?

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

'urlopen (url)' sẽ tải xuống toàn bộ tệp chỉ để tải tiêu đề. Một giải pháp là sử dụng một yêu cầu tùy chỉnh sẽ cho phép urlopen sử dụng HEAD để mở url thay vì GET –

+1

Kiểm tra Furthur cho thấy toàn bộ tệp không được tải xuống, chỉ một đoạn có kích thước tùy ý và kết nối vẫn mở cho đến khi 'f' đi ra ngoài của phạm vi - đây là một chút điều ác để làm với máy chủ. –

Trả lời

12

Giống như vậy:

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

Điều đó sẽ chỉ tải về và in các tiêu đề bởi vì nó được thực hiện một yêu cầu HEAD:

yêu cầu phản ứng giống với một trong đó sẽ tương ứng yêu cầu GET nhưng không có phản hồi cơ thể. Điều này hữu ích khi truy xuất thông tin meta được viết bằng phản hồi tiêu đề, mà không phải vận chuyển toàn bộ nội dung.

(qua Wikipedia)

+2

+1, vâng, HEAD thực sự là con đường để đi. –

+0

Có gì sai với tôi không? f = urllib2.urlopen (url) params ['mime'] = f.headers ['content-type'] – TIMEX

+0

@alex: vâng, nó sẽ tải xuống toàn bộ tệp. –

4

Đây là một câu trả lời mức cao hơn của Brian. Sử dụng máy móc urllib có những ưu điểm thông thường như xử lý chuyển hướng tự động và vân vân.

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

bạn có thể nhận được các loại video sử dụng các phương pháp thông tin() hoặc các tiêu đề dict

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

Một chạy thử nghiệm với một tập tin avi lựa chọn ngẫu nhiên googled trên mạng đó là hơn 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 

nó sẽ chỉ "chiếm băng thông" khi tệp thực sự được tải xuống, nghĩa là các gói đang được gửi đến và đi từ ổ cắm.

+0

Điều đó sẽ tải xuống toàn bộ tệp. –

+0

tải xuống toàn bộ tệp? như trong tải về địa phương và vì vậy tôi có một tập tin vật lý thực tế? Không, nó sẽ không. Bên cạnh đó, OP hỏi có gì sai với phương pháp này, vì vậy tôi đang cho anh ta thấy anh ta sai ở đâu. – ghostdog74

+0

Nó sẽ thực hiện một yêu cầu sẽ ** tải xuống ** toàn bộ tệp.Tất nhiên nó sẽ không được lưu trữ vào hệ thống tập tin của bạn nhưng yêu cầu sẽ chặn và lãng phí băng thông cho * không có lý do gì *. –

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