def __next__(self): offset = self.file.tell() handle = eccodes.codes_new_from_file(self.file, eccodes.CODES_PRODUCT_GRIB) if not handle: raise StopIteration() return CodesHandle(handle, self.path, offset)
def _next_handle(self): offset = self.file.tell() handle = eccodes.codes_new_from_file(self.file, eccodes.CODES_PRODUCT_GRIB) if not handle: return None return CodesHandle(handle, self.path, offset)
def scan_grib(self, **kwargs): gribs = [] v_selected = kwargs['shortName'] v_pert = kwargs.get('perturbationNumber', -1) if not utils.is_container(v_selected): v_selected = [v_selected] if self._grbindx: for v in v_selected: codes_index_select(self._grbindx, 'shortName', str(v)) if v_pert != -1: codes_index_select(self._grbindx, 'perturbationNumber', int(v_pert)) while 1: gid = codes_new_from_index(self._grbindx) if gid is None: break if GRIBReader._find(gid, **kwargs): gribs.append(gid) else: # release unused grib codes_release(gid) elif self._file_handler: while 1: gid = codes_new_from_file(self._file_handler, product_kind=CODES_PRODUCT_GRIB) if gid is None: break if GRIBReader._find(gid, **kwargs): gribs.append(gid) else: # release unused grib codes_release(gid) return gribs
def from_file(cls, file, offset=None, product_kind=eccodes.CODES_PRODUCT_ANY, **kwargs): # type: (T.IO[bytes], int, int, T.Any) -> Message field_in_message = 0 if isinstance(offset, tuple): offset, field_in_message = offset if offset is not None: file.seek(offset) codes_id = None # iterate over multi-fields in the message for _ in range(field_in_message + 1): codes_id = eccodes.codes_new_from_file(file, product_kind=product_kind) if codes_id is None: raise EOFError("End of file: %r" % file) return cls(codes_id=codes_id, **kwargs)
def generate_grib(target, **kwargs): import eccodes for k, v in list(kwargs.items()): if not isinstance(v, (list, tuple)): kwargs[k] = [v] handle = None try: with open(os.path.join(os.path.dirname(__file__), "dummy.grib"), "rb") as f: handle = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_GRIB) with open(target, "wb") as f: for r in iterate_request(kwargs): for k, v in r.items(): eccodes.codes_set(handle, k, v) eccodes.codes_write(handle, f) finally: if handle is not None: eccodes.codes_release(handle)
def __init__( self, codes_file=None, clone=None, sample=None, headers_only=False, other_args_found=False, ): """ Open a message and inform the host file that it's been incremented. If ``codes_file`` is not supplied, the message is cloned from ``CodesMessage`` ``clone``. If neither is supplied, the ``CodesMessage`` is cloned from ``sample``. :param codes_file: A file readable for ecCodes :param clone: A valid ``CodesMessage`` :param sample: A valid sample path to create ``CodesMessage`` from """ if (not other_args_found and codes_file is None and clone is None and sample is None): raise RuntimeError("CodesMessage initialization parameters not " "present.") #: Unique ID, for ecCodes interface self.codes_id = None #: File containing message self.codes_file = None if codes_file is not None: self.codes_id = eccodes.codes_new_from_file( codes_file.file_handle, self.product_kind, headers_only) if self.codes_id is None: raise IOError("CodesFile %s is exhausted" % codes_file.name) self.codes_file = codes_file self.codes_file.message += 1 self.codes_file.open_messages.append(self) elif clone is not None: self.codes_id = eccodes.codes_clone(clone.codes_id) elif sample is not None: self.codes_id = eccodes.codes_new_from_samples( sample, self.product_kind)
def has_geopotential(self): has_geo = False from pyg2p.main.config import GeopotentialsConfiguration v_selected = GeopotentialsConfiguration.short_names if self._grbindx: for v in v_selected: codes_index_select(self._grbindx, 'shortName', str(v)) while 1: gid = codes_new_from_index(self._grbindx) if gid is None: break has_geo = True codes_release(gid) elif self._file_handler: while 1: gid = codes_new_from_file(self._file_handler, product_kind=CODES_PRODUCT_GRIB) if gid is None: break has_geo = True codes_release(gid) return has_geo
def test_new_from_file(): fpath = get_sample_fullpath("GRIB2.tmpl") if fpath is None: return with open(fpath, "rb") as f: msgid = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_GRIB) assert msgid fpath = get_sample_fullpath("BUFR4.tmpl") with open(fpath, "rb") as f: msgid = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_BUFR) assert msgid fpath = get_sample_fullpath("clusters_grib1.tmpl") with open(fpath, "rb") as f: msgid = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_ANY) assert msgid with open(fpath, "rb") as f: msgid = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_GTS) assert msgid is None with open(fpath, "rb") as f: msgid = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_METAR) assert msgid is None with pytest.raises(ValueError): with open(fpath, "rb") as f: eccodes.codes_new_from_file(f, 1024)