Skip to content
Snippets Groups Projects
extract_nc.py 1.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • Maria Tarasevich's avatar
    Maria Tarasevich committed
    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()