0

NASAサーバー( URL )からファイル(約1〜1.5MB /ファイル)をダウンロードしようとしていますが、役に立ちません!urllib2でいくつか試してみたところ、次の2つの結果が出ました。

  1. 自分のマシン上に、わずか200KBで、何も含まれていない新しいファイルを作成します
  2. 自分のマシンに何も入っていない1.5MBのファイルを作成します!

「何も入っていない」とは、ファイルを開くと(これらはhdf5ファイルなので、hdfViewで開く)、階層構造が表示されないことを意味します...文字通り空のh5ファイルのように見えます。しかし、テキストエディタでファイルを開くと、そこに何かがあることがわかります(バイナリなので、テキストでは...まあ、バイナリのように見えます)。

私はこれまでurllib2をうまく使用したことがありませんが、urllib2を適切に使用していると思います。私がしていることが正しいかどうかについてコメントし、もっと良いことを提案していただけませんか?

from urllib2 import Request, urlopen, URLError, HTTPError
base_url = 'http://avdc.gsfc.nasa.gov/index.php?site=1480884223&id=40&go=list&path=%2FH2O%2F/2010'
file_name = 'download_2.php?site=1480884223&id=40&go=download&path=%2FH2O%2F2010&file=MLS-Aura_L2GP-H2O_v03-31-c01_2010d360.he5'


url = base_url + file_name
req = Request(url)

# Open the url
try:
    f = urlopen(req)
    print "downloading " + url

    # Open our local file for writing
    local_file = open('test.he5', "w" + file_mode)
    #Write to our local file
    local_file.write(f.read())
    local_file.close()

except HTTPError, e:
    print "HTTP Error:",e.code , url
except URLError, e:
    print "URL Error:",e.reason , url

このスクリプト(動作に最も近いようです)をここから取得しました。
file_nameがどうあるべきかわかりません。アーカイブのページソース情報を調べて、そこにリストされているファイル名(Webページに表示されるものとは異なります)を取得しました。これを行うと、hdfviewに何も表示されない1.5MBのファイルが生成されます。

4

1 に答える 1

1

無効な URL を作成しています:

base_url = 'http://avdc.gsfc.nasa.gov/index.php?site=1480884223&id=40&go=list&path=%2FH2O%2F/2010'
file_name = 'download_2.php?site=1480884223&id=40&go=download&path=%2FH2O%2F2010&file=MLS-Aura_L2GP-H2O_v03-31-c01_2010d360.he5'

url = base_url + file_name

あなたはおそらく次のことを意味していました:

base_url = 'http://avdc.gsfc.nasa.gov/'
file_name = 'download_2.php?site=1480884223&id=40&go=download&path=%2FH2O%2F2010&file=MLS-Aura_L2GP-H2O_v03-31-c01_2010d360.he5'

大きなファイルをダウンロードするときは、ファイルハンドルからファイルハンドルへのバッファリングされたコピーを使用することをお勧めします:

import shutil

# ...
f = urlopen(req)
with open('test.he5', "w" + file_mode) as local_file:
    shutil.copyfileobj(f, local_file)

.copyfileobj開いている urllib 接続から効率的にロードし、開いているlocal_fileファイル ハンドルに書き込みます。ステートメントに注意してwithください。下のコード ブロックが終了すると、自動的にファイルが閉じられます。

于 2012-10-26T13:15:30.250 に答える