Как сохранить файл, используя httplib2 в python? - PullRequest
2 голосов
/ 19 февраля 2012

Я могу запустить следующий код:

import httplib2

h = httplib2.Http('.cache')

response, content = h.request('http://2.bp.blogspot.com/-CXFfl9luHPM/TV-Os6opQfI/AAAAAAAAA2E/oCgrgvWqzrY/s1600/cow.jpg')

print(response.status)

with open('cow.jpg', 'wb') as f:
    f.write(content)

Когда я запускаю код, я загружаю файл с именем cow.jpg, который мне нужен, но я также получаю дублированное изображение с другим именем: 2.bp.blogspot.com, -CXFfl9luHPM, TV-Os6opQfI , AAAAAAAAA2E, oCgrgvWqzrY, S1600, cow.jpg, 77ba31012a25509bfdc78bea4e1bfdd1. Это http адрес с запятыми и прочим хламом. Любые идеи о том, как я могу создать только одно изображение, используя httplib2? Спасибо.

Ответы [ 3 ]

3 голосов
/ 19 февраля 2012

Просто запишите содержимое в файл:

with open('cow.jpg', 'wb') as f:
    f.write(content)
1 голос
/ 19 февраля 2012

Используйте urllib и метод urlretrieve, вторым аргументом является местоположение файла.

для python 2.x

import urllib
urllib.urlretrieve(URL, path_destination)
0 голосов
/ 19 февраля 2012

Тебе тоже подходит urllib2?Если да, вы можете использовать эту функцию:

def download_file(url):
    """Create an urllib2 request and return the request plus some useful info"""
    name = filename_from_url(url)
    r = urllib2.urlopen(urllib2.Request(url))
    info = r.info()
    if 'Content-Disposition' in info:
        # If the response has Content-Disposition, we take filename from it
        name = info['Content-Disposition'].split('filename=')[1]
        if name[0] == '"' or name[0] == "'":
            name = name[1:-1]
    elif r.geturl() != url:
        # if we were redirected, take the filename from the final url
        name = filename_from_url(r.geturl())
    content_type = None
    if 'Content-Type' in info:
        content_type = info['Content-Type'].split(';')[0]
    # Try to guess missing info
    if not name and not content_type:
        name = 'unknown'
    elif not name:
        name = 'unknown' + mimetypes.guess_extension(content_type) or ''
    elif not content_type:
        content_type = mimetypes.guess_type(name)[0]
    return r, name, content_type

Использование:

fp, filename, content_type = download_file('http://url/to/some/file')
with open('somefile', 'w') as dst:
    shutil.copyfileobj(fp, dst)

Этот код обладает тем преимуществом, что никогда не считывает весь файл в память - поэтому он отлично работает для огромныхфайлы тоже.Кроме того, он также дает вам имя файла, полученное с сервера, и тип содержимого, если вы хотите / нуждаетесь в этом.

...