国立研究開発法人防災科学技術研究所 水・土砂防災研究部門
国立研究開発法人防災科学技術研究所 水・土砂防災研究部門
トップ 一覧 検索 ヘルプ RSS ログイン

Python-NetCDFでの配列の扱い-nc_close

pythonでnetcdfから変数を取得した後で、nc_closeをすると、その変数を扱えなくなる。
具体例として、

main:
  var = read_NC(infile,"U")

あるNetCDFファイルを読み、変数を取得し、その配列を返す函数を定義している。

ダメな例

def read_NC(infile,varname):
   nc = netCDF4.Dataset(infile,"r")
   nc.set_auto_mask(False)
   var = nc.variables[varname]
   nc.close()
   return var

上の例では、nc.closeをした瞬間に、varも読取が不可能となる。
varはnetCDFのオブジェクトなので、closeしてしまうと、そのファイルから読んだすべての情報で
netCDF由来のオブジェクトは扱うことができない。だからといって、closeしないと大量のファイルをループで
扱う場合にメモリ不足で実行できなくなる。そこで、読み込んだあとに、netcdf由来のオブジェクトから、普通のリストに
変更してあげる必要がある。下がその例です。

上手くいく例

def read_NC(infile,varname):
   nc = netCDF4.Dataset(infile,"r")
   nc.set_auto_mask(False)
   var = nc.variables[varname]
   var2 = var[:]
   nc.close()
   return var2

スライジングを使って、netcdf由来のオブジェクトではなくしたことで、nc.closeによる影響を受けない。
ただし、netcdfのオブジェクトではないので、様々な情報(unit, long_nameなど)も得ることができなくなる。