Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import netCDF4 as nc
import numpy as np
import argparse
def summary(vars, dims):
for var in vars:
dims_str = ' x '.join('%d(%s)' % (dims[dim], dim) for dim in reversed(var.dimensions))
print(' name =', var.name, ', dims =', dims_str, ', type =', var.dtype)
attrs = {attr: var.getncattr(attr) for attr in var.ncattrs()}
print(' long_name =', attrs.get("long_name"), ', standard_name =', attrs.get("standard_name"))
def main():
parser = argparse.ArgumentParser(description='Extract STD fields from netCDF4 file')
parser.add_argument('-i', '--input', help='input netCDF4 file', required=True)
parser.add_argument('-v', '--var', action='append', help='Field variable to extract, may be specified multiple times')
parser.add_argument('-o', '--out-format', default='{v}.std', help='Output filename pattern. Patter %s will be replaced with variable name')
args = parser.parse_args()
root = nc.Dataset(args.input, "r")
dims = {dim.name: dim.size for dim in root.dimensions.values()}
vars = root.variables
if not args.var:
print('No variables to extract, printing variable summary')
summary(vars.values(), dims)
else:
for var_name in args.var:
if var_name not in vars:
print(f"Variable {var_name} is not present in the file")
return
if len(args.var) > 1 and ('{v}' not in args.out_format):
print("Several vars are requested but output file is the same for all vars. Please use {v} to produce different files")
return
for var_name in args.var:
var = vars[var_name]
outfn = args.out_format.format(v=var_name)
print(f'Extracting {var_name} with type {var.dtype} and size {tuple(reversed(var.shape))} into {outfn}')
np.array(var).tofile(outfn)
if __name__ == "__main__":
main()