pygrib
的文档显示了一个名为fromstring
的函数,该函数从表示二进制格里布消息的python字节对象创建gribmessage实例。我可能误解了这个函数的目的,但它让我相信我可以用它来代替下载 GRIB 文件并在其上使用open
函数。不幸的是,我尝试从 NLDAS2 打开多消息 GRIB 文件失败了。有没有人知道如何在不先保存文件的情况下对 GRIB 数据使用pygrib
?我下面的代码显示了我希望它如何工作。相反,它会在行for grib in gribs:
上给出错误TypeError: expected bytes, int found
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 文件,但如果有人想编写代码,作者对拉取请求持开放态度。不幸的是,我的研究重点已经转移,我没有时间贡献自己。
正如 jasonharper 所说,你可以使用 pygrib.fromstring((。我只是自己尝试过,这有效。
这是文档的链接。
从 pygrib v2.1.4 开始,更新日志说 pygrib.open(( 现在接受io。作为输入参数的 BufferedReader对象。 在此处查看 Pygrib 更新日志
从理论上讲,这将允许您从RAM内存中读取GRIB2文件,而无需将其写入磁盘。
我认为用法应该是以下:
binary_io = io.BytesIO(bytes_data) buffer_io = io.BufferedReader(binary_io) grib_file = pygrib.open(buffer_io)
但我无法让它在我这边工作!