Загрузка веб-изображения 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)

Он читает / записывает порциями, что позволяет вам аккуратно загружать большие файлы.

Другие вопросы по тегам