eccodes/examples/python/grib_ls_JSON.py

107 lines
2.8 KiB
Python
Raw Normal View History

2017-01-03 11:03:48 +00:00
# Copyright 2005-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
#
# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
#
# Python implementation: bufr_read_tropical_cyclone
#
# Description: how to read data of the ECMWF EPS tropical cyclone tracks encoded in BUFR format.
#
import traceback
import sys
import os
import getopt
from eccodes import *
VERBOSE=1 # verbose error reporting
default_namespace='ls'
def do_print(namespace, INPUT):
f = open(INPUT)
first_time = True
print '{'
print ' "messages" : ['
while 1:
gid = codes_grib_new_from_file(f)
if gid is None:
break
if not first_time:
print ' ,{'
else:
print ' {'
first_time = False
iterid = codes_keys_iterator_new(gid, namespace)
f1 = True
while codes_keys_iterator_next(iterid):
keyname = codes_keys_iterator_get_name(iterid)
keyval = codes_get_string(iterid,keyname)
if not f1:
print ','
else:
print ''
f1 = False
print " \"%s\" : \"%s\"" % (keyname,keyval),
print ''
print ' }'
codes_keys_iterator_delete(iterid)
codes_release(gid)
print ' ]'
print '}'
f.close()
def usage():
progname = os.path.basename(sys.argv[0])
print "Usage: ", progname, "[options] grib_file1 grib_file2 ..."
print 'Options:'
print '\t-n namespace'
print '\t\tAll the keys belonging to namespace are printed.'
print '\t-m Mars keys are printed.'
print ''
def main():
if len(sys.argv) < 2:
usage()
return 1
try:
options = "mn:"
namespace = default_namespace
opts, args = getopt.getopt(sys.argv[1:], options)
for o, a in opts:
if o == '-m':
namespace = 'mars'
elif o == '-n':
namespace = a or default_namespace
else:
assert False, 'Invalid option'
# Check we have some GRIB files to process
if not args:
usage()
return 1
for arg in args:
do_print(namespace, arg)
except getopt.GetoptError as err:
print 'Error: ',err
usage()
return 1
except GribInternalError as err:
if VERBOSE:
traceback.print_exc(file=sys.stderr)
else:
print >>sys.stderr,err.msg
return 1
if __name__ == "__main__":
sys.exit(main())