#!/usr/bin/env python import sys from gribapi import * import random import traceback VERBOSE=1 WRITE=0 class Usage(Exception): def __init__(self): pass def test(): # test new from sample #grib_release(grib_new_from_samples("GRIB2")) if len(sys.argv) < 2: raise Usage infile = sys.argv[1] outfile = infile + ".out" multifile = infile + ".multi" clonefile = infile + ".clone" binstrfile = infile + ".binstr" fid = open(infile,"r") while 1: gid = grib_new_from_file(fid) if not gid: break grib_release(gid) fid.close() fid = open(infile,"r") out = open(outfile,"w") multi = open(outfile,"w") clone_fid = open(clonefile,"w") binstr_fid = open(binstrfile,"w") #print "Writing from binary string to ",binstrfile #x = grib_read_file(fid) #print len(x) #grib_write_file(binstr_fid,x) #grib_close_file(binstr_fid) print "Operating on file '%s'" % infile n = grib_count_in_file(fid) print "Message count ",n # multi support test grib_multi_support_on() ismulti = "no" if (n == grib_count_in_file(fid)) else "yes" print "Is multi field - %s" % ismulti grib_multi_support_off() # end multi support test # gribex support test on/off print "Gribex support on/off" grib_gribex_mode_on() grib_gribex_mode_off # end gribex support test print "Browsing through messages " for i in range(n): gid = grib_new_from_file(fid) #grib_dump(gid) #grib_print(gid,"centre") if i == 0: print "Message size: ",grib_get_message_size(gid) nval = grib_get_size(gid,"values") print "Number of values in message %d is %d" % (i,nval) print "== %s %s %s %d ==" % \ ( \ grib_get_string(gid,"shortName"), \ grib_get_string(gid,"name"), \ grib_get_string(gid,"typeOfLevel"), \ grib_get_long(gid,"level"), \ ) print "Nearest point to 10,10: " print grib_find_nearest(gid,10,10) print grib_find_nearest(gid,10,10,npoints=4) rand_list = [] for i in range(0,5): rand_index = random.randint(1,nval) rand_list.append(rand_index) myval = grib_get_double_element(gid,"values",rand_index) print "Random index value[%d] = %.8f" % (rand_index,myval) all4rand = grib_get_double_elements(gid,"values",rand_list) print "All at once index values: ",all4rand centre = grib_get_string(gid,"centre") grib_set_string(gid,"centre","ecmf") new_centre = grib_get_string(gid,"centre") print "Before/after string centre: %s/%s" % (centre,new_centre) centre = grib_get_long(gid,"centre") grib_set_long(gid,"centre",99) new_centre = grib_get_long(gid,"centre") print "Before/after numeric centre: %d/%d" % (centre,new_centre) centre = grib_get_double(gid,"centre") grib_set_double(gid,"centre",9) new_centre = grib_get_double(gid,"centre") print "Before/after numeric floating point centre: %f/%f" % (centre,new_centre) vals = grib_get_double_array(gid,"values") print "Values before: ",vals[:10] grib_set_double_array(gid,"values",(1.0, 2.0, 3.14)) vals = grib_get_double_array(gid,"values") print "Values after: ",vals[:10] print "Saving modified message to %s" % outfile if WRITE: grib_write(gid,out) print "Creating and saving a clone to %s" % clonefile clone_gid = grib_clone(gid) if WRITE: grib_write(clone_gid,clone_fid) grib_release(clone_gid) Ni = grib_get(gid,"Ni") print "Setting Ni to missing from --> ",Ni grib_set_missing(gid,"Ni") assert grib_is_missing(gid,"Ni") miss_Ni = grib_get(gid,"Ni") print "Ni is now --> ",miss_Ni grib_set(gid,"Ni",Ni) new_Ni = grib_get(gid,"Ni") print "Set Ni back to its original value --> ",new_Ni assert Ni == new_Ni #grib_multi_write(gid,multi) grib_release(gid) fid.close() out.close() clone_fid.close() print "Closed file" def main(): try: test() except GribInternalError as err: if VERBOSE: traceback.print_exc(file=sys.stderr) else: print >>sys.stderr,err.msg return 1 except Usage: print "Usage: %s infile" % sys.argv[0] sys.exit(2) if __name__ == "__main__": main() print "------------------------------------"