2013-02-19 8 views
0

Я пытаюсь загрузить файл hdf5 с http-сервера. Я могу сделать это с помощью Python подпроцесс модуля и wget, но я чувствую, что я обманывалЧто такое pythonic способ загрузки файлов hdf5 с http-сервера?

# wget solution 
    import subprocess 
    url = 'http://url/to/file.h5' 
    subprocess(['wget', '--proxy=off', url]) 

Я могу также использовать URLLIB и запрос модулей для загрузки изображений, как это:

# requests solution 
    url2 = 'http://url/to/image.png' 
    r = requests.get(url2) 
    with open('image.png', 'wb') as img: 
    img.write(r.content) 

    # urllib solution 
    urllib.urlretrieve(url2, 'outfile.png') 

Однако, когда Я пытаюсь загрузить hdf5-файл с помощью этого метода и запустить команду оболочки «файл» я получаю:

>file test.h5 
    >test.h5: HTML document, ASCII text, with very long lines 

Вот заголовок из requests.get() (не уверен, если это поможет)

{'accept-ranges': 'bytes', 
    'content-length': '413399', 
    'date': 'Tue, 19 Feb 2013 08:51:06 GMT', 
    'etag': 'W/"413399-1361177055000"', 
    'last-modified': 'Mon, 18 Feb 2013 08:44:15 GMT', 
    'server': 'Apache-Coyote/1.1'} 

Должен ли я использовать подпроцесс wget throug или есть ли решение pythonic?

Решение: Проблема была вызвана тем, что я не отключить прокси-сервер, прежде чем я пытался загрузить файл и из-за того, что перевод был перехвачен. Этот кусок кода сделал трюк.

import urllib2 
    proxy_handler = urllib2.ProxyHandler({}) 
    opener = urllib2.build_opener(proxy_handler) 
    urllib2.install_opener(opener) 

    url = 'http://url/to/file.h5' 

    req = urllib2.Request(url) 
    r = opener.open(req) 
    result = r.read() 

    with open('my_file.h5', 'wb') as f: 
     f.write(result) 
+0

С urllib вы действительно посмотрели файл? Это похоже на то, что запрос перехватывается, и вы загружаете html-документ вместо требуемого png. Может быть, вы можете найти лучшую ссылку? – Oin

+0

Вы верны, запрос был перехвачен! Когда я отключил прокси-сервер и сделал некоторые другие вещи, я, наконец, получил нужный файл. Это был мой первый пост для SO. Можно ли включить мое полное решение в исходный вопрос? Должен ли я каким-то образом изменить название вопроса? – LordBullingdon

+0

Да, вы можете просто изменить свой вопрос, а затем опубликовать свой ответ. – Oin

ответ

0

Попробуйте использовать urllib.geturl, чтобы получить реальный URL (после редиректов), а затем передать, что urlretrieve.