現在、私の Python 3 スクリプトは、NASA の GES DISC から 50MB の .hdf ファイル (数千個) をダウンロードし、それらをディスクに書き込み、再度読み取り、ファイル内のデータの約 2% を選択して保存します。明らかに、データの 2% のみを保存し、ファイル全体をディスクに書き込まなければ、ディスクの読み書きが最小限に抑えられます。
注: この例は、無料のEarthdataユーザー名/パスワードrequests
を持っていないと機能しません
import requests
url = 'https://airsl1.gesdisc.eosdis.nasa.gov/data/Aqua_AIRS_Level1/AIRIBRAD.005/2021/001/AIRS.2021.01.01.001.L1B.AIRS_Rad.v5.0.25.0.G21001215039.hdf'
with requests.Session() as session:
session.auth = (username, password)
r1 = session.request('get', url)
r = session.get(r1.url, auth=(username, password))
これで、.hdf ファイルがメモリに保存されました。次の一般的な手順は、ディスクへの書き込みです。
result.raise_for_status()
f = open('C:\\data\\file.hdf','wb')
f.write(r.content)
f.close()
それからもう一度読み込んでください:
from pyhdf.SD import *
f = SD('C:\\data\\file.hdf', SDC.READ)
data_i_want = f.select('Latitude') # etc...
ディスクの書き込み/読み取りをスキップして、次のようなことを行うのが理想的です。
import requests
from pyhdf.SD import *
url = 'https://airsl1.gesdisc.eosdis.nasa.gov/data/Aqua_AIRS_Level1/AIRIBRAD.005/2021/001/AIRS.2021.01.01.001.L1B.AIRS_Rad.v5.0.25.0.G21001215039.hdf'
with requests.Session() as session:
session.auth = (username, password)
r1 = session.request('get', url)
r = session.get(r1.url, auth=(username, password))
f = SD(r.content, SDC.READ)
data_i_want = f.select('Latitude') # etc...
しかし、これはエラーをスローします:HDF4Error: SD: no such file
ディスクに触れずに r.content を PyHDF に渡す方法はありますか?