Как можно открыть файл GRIB с помощью pygrib без предварительной загрузки файла?

В документации для pygrib показана функция fromstring, которая создает экземпляр gribmessage из объект python bytes, представляющий двоичное сообщение grib. Возможно, я неправильно понимаю назначение этой функции, но это наводит меня на мысль, что я могу использовать ее вместо загрузки файла GRIB и применения к нему функции open. К сожалению, мои попытки открыть файл GRIB с несколькими сообщениями из NLDAS2 не увенчались успехом. Кто-нибудь еще знает, как использовать pygrib для данных GRIB без предварительного сохранения файла? Мой код ниже показывает, как я хотел бы, чтобы он работал. Вместо этого выдает ошибку TypeError: expected bytes, int found в строке for grib in gribs:

from urllib import request
import pygrib

url = "<remote address of desired file>"
username = "<username>"
password = "<password>"

redirectHandler = request.HTTPRedirectHandler()
cookieProcessor = request.HTTPCookieProcessor()
passwordManager = request.HTTPPasswordMgrWithDefaultRealm()
passwordManager.add_password(None, "https://urls.earthdata.nasa.gov", username, password)
authHandler = request.HTTPBasicAuthHandler(passwordManager)
opener = request.build_opener(redirectHandler, cookieProcessor, authHandler)
request.install_opener(opener)

with request.urlopen(url) as response:
    data = response.read()
    gribs = pygrib.fromstring(data)
    for grib in gribs:
        print(grib)

Изменить, чтобы добавить весь вывод ошибки:

Traceback (most recent call last):
  File ".\example.py", line 19, in <module>
    for grb in grbs:
  File "pygrib.pyx", line 1194, in pygrib.gribmessage.__getitem__
TypeError: expected bytes, int found

Изменить: этот интерфейс не поддерживает файлы GRIB с несколькими сообщениями, но авторы открыты для запроса на включение, если кто-то хочет написать код. К сожалению, моя исследовательская направленность сместилась, и у меня нет времени, чтобы внести свой вклад.


person FlippingBinary    schedule 11.05.2020    source источник
comment
Пожалуйста, предоставьте весь вывод ошибки. В коде, которым вы поделились, вы все еще загружаете файл самостоятельно, не так ли?   -  person AMC    schedule 11.05.2020
comment
@AMC В любом случае я загружаю файл, но не хочу сохранять его на диск. Если я хочу, чтобы это работало, я должен сохранить его на диск, а затем использовать pygrib.open(filename)   -  person FlippingBinary    schedule 11.05.2020
comment
pygrib.fromstring() очевидно работает с одним сообщением GRIB - это не то, что вы можете перебирать. Вам придется каким-то образом разделить полученные данные на отдельные сообщения (я понятия не имею, как вы это сделаете) и вызвать .fromstring() для них по отдельности.   -  person jasonharper    schedule 11.05.2020
comment
@jasonharper Это то, что я подозревал, но не хотел верить. Спасибо.   -  person FlippingBinary    schedule 11.05.2020
comment
Взгляните на github.com/ecmwf/cfgrib. Это движок для xarray! С моей точки зрения, это современный уровень обработки наборов геопространственных данных.   -  person dl.meteo    schedule 05.06.2020


Ответы (1)


Как заявил jasonharper, вы можете использовать pygrib.fromstring(). Я только что попробовал это сам, и это работает.

Вот ссылка на документацию.

person Jorn.Beyers    schedule 15.10.2020
comment
Это не работает для файлов GRIB с более чем одним сообщением, поэтому исключаются все файлы GRIB из NLDAS2. - person FlippingBinary; 16.10.2020