2013-04-06 21 views
9

Tak więc, mam do czynienia z urllib.request w Pythonie 3 i zastanawiam się, jak napisać wynik pobrania pliku internetowego do pliku na komputerze lokalnym. Próbowałem to:Jak mogę pobrać plik za pomocą urllib.request w Pythonie 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) 

Ale mam ten błąd:

TypeError: 'HTTPResponse' does not support the buffer interface 

Co robię źle?

UWAGA: Widziałem this question, ale jest to związane z Pythonem 2'S urllib2 który został zweryfikowany w Pythonie 3.

+0

możliwy duplikat [Pobierz plik z Internetu w Pythonie 3] (http://stackoverflow.com/questions/7243750/download-file-from-web-in-python-3) – kenorb

Odpowiedz

8

zmiany

f.write(g) 

do

f.write(g.read()) 
0

łatwiejszy sposób myślę (możesz również zrobić to w dwóch wierszach) należy użyć:

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

Co do użytej metody. Gdy używasz g = urllib.request.urlopen('http://media-mcw.cursecdn.com/3/3f/Beta.png'), po prostu pobierasz plik. Musisz użyć g.read(), g.readlines() lub g.readline(), aby ją odczytać.

To tak jak czytanie normalnego pliku (z wyjątkiem składni) i może być traktowane w bardzo podobny sposób.

+0

"PEP20" będzie Cię użyj 'Request' z' urllib.request', ale twój miałby mniej linii kodu. [Informacje na temat wniosku PEP20] (https://docs.python.org/3.2/library/urllib.request.html). Możesz użyć 'open()' przykutego do 'file.write (url.read())' jak wspomniałeś. – Debug255

+0

@ Debug255 Czy jesteś pewien? W linku wspomniano: "Otwórz adres URL URL, który może być ciągiem lub obiektem żądania.", Tutaj podałem ciąg znaków, więc nie sądzę, że żądanie jest wymagane w tym przypadku. – Simon

Powiązane problemy