Загрузка веб-изображения w/ urlopen/shutil: ошибка __exit__
Я пытаюсь загрузить изображения с shutil/urlopen из-за устаревших? Я не уверен, что он устарел, но urlretrieve не загружает файл, он просто создает папку с именем изображения. Посмотрев на другой вопрос, я увидел тот, который предоставляет этот код, но я также получаю сообщение об ошибке.
from urllib2 import urlopen
from shutil import copyfileobj
url = 'http://www.watchcartoononline.com/thumbs/South-Park-Season-14-Episode-11-Coon-2-Hindsight.jpg'
path = 'image.jpg'
with urlopen(url) as in_stream, open(path, 'wb') as out_file:
copyfileobj(in_stream, out_file)
выход
with urlopen(url) as in_stream, open(path, 'wb') as out_file:
AttributeError: addinfourl instance has no attribute '__exit__
3 ответа
Попробуй это:
import urllib
urllib.urlretrieve("http://url/img.jpg", "img.jpg")
urlopen
не реализует менеджер контекста, поэтому вы не можете использовать его в with
блок. Вот отчет об ошибке.
Вы могли бы использовать contextlib.closing
обернуть его, хотя в сообщении об ошибке выше также упоминаются некоторые проблемы с этим.
ПРИМЕЧАНИЕ: это относится только к Python < 3.2
urlopen
не является контекстным менеджером в Python 2 (я не знаю о 3). Вы должны вручную открыть и закрыть его:
in_stream = urlopen(url)
with open(path, 'wb') as out_file:
copyfileobj(in_stream, out_file)
in_stream.close()
Вы также можете просто использовать urllib.urlretrieve
:
import urllib
urllib.urlretrieve(url, path)
Он читает / записывает порциями, что позволяет вам аккуратно загружать большие файлы.