2013-04-06 31 views
9

Vì vậy, tôi đang rối tung xung quanh với urllib.request trong Python 3 và tôi tự hỏi làm thế nào để viết kết quả của việc nhận được một tập tin internet vào một tập tin trên máy địa phương. Tôi cố gắng này:Làm cách nào để tải xuống tệp bằng cách sử dụng urllib.request trong Python 3?

g = urllib.request.urlopen('http://media-mcw.cursecdn.com/3/3f/Beta.png') 
with open('test.png', 'b+w') as f: 
    f.write(g) 

Nhưng tôi đã nhận lỗi này:

TypeError: 'HTTPResponse' does not support the buffer interface 

Tôi đang làm gì sai?

Chú ý: Tôi đã thấy this question, nhưng nó liên quan đến Python 2 của urllib2 được kiểm tra kỹ lưỡng bằng Python 3.

+0

bản sao có thể có của [Tải xuống tệp từ web bằng Python 3] (http://stackoverflow.com/questions/7243750/download-file-from-web-in-python-3) – kenorb

Trả lời

8

thay đổi

f.write(g) 

để

f.write(g.read()) 
0

Một cách dễ dàng hơn tôi nghĩ (bạn cũng có thể làm điều đó trong hai dòng) là sử dụng:

import urllib.request 
urllib.request.urlretrieve('http://media-mcw.cursecdn.com/3/3f/Beta.png', 'test.png') 

Đối với phương pháp bạn đã sử dụng. Khi bạn sử dụng g = urllib.request.urlopen('http://media-mcw.cursecdn.com/3/3f/Beta.png'), bạn chỉ cần tìm nạp tệp. Bạn phải sử dụng g.read(), g.readlines() hoặc g.readline() để đọc nó.

Giống như đọc một tệp thông thường (ngoại trừ cú pháp) và có thể được xử lý theo cách tương tự.

+0

'PEP20' sẽ có bạn sử dụng 'Request' từ' urllib.request' nhưng bạn sẽ có ít dòng mã hơn. [Thông tin về PEP20 cho Yêu cầu] (https://docs.python.org/3.2/library/urllib.request.html). Bạn có thể sử dụng 'mở()' chuỗi để 'file.write (url.read())' như bạn đã đề cập. – Debug255

+0

@ Debug255 Bạn có chắc chắn không? Liên kết được đề cập 'Mở url URL, có thể là chuỗi hoặc đối tượng Yêu cầu.', ở đây tôi đã chỉ định chuỗi nên tôi không nghĩ Yêu cầu là bắt buộc trong trường hợp này. – Simon

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