首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python解码NDFD Grib二进制文件类似于使用Open(path,'wb')和xarray.load_dataset(path,engine='cfgrib')读取文件

Python解码NDFD Grib二进制文件类似于使用Open(path,'wb')和xarray.load_dataset(path,engine='cfgrib')读取文件
EN

Stack Overflow用户
提问于 2021-08-26 12:19:01
回答 1查看 99关注 0票数 0

我有以下代码可以正常工作:

代码语言:javascript
复制
import pandas as pd
import requests
import xarray as xr
import cfgrib

r = requests.get(
    'https://tgftp.nws.noaa.gov/SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.neast/VP.001-003/ds.wspd.bin', 
    stream=True)

f = open('..\\001_003wspd.grb', 'wb')
f.write(r.content)
f.close()

xr_set = xr.load_dataset('..\\001_003wspd.grb', engine="cfgrib")
windspeed_df = xr_set.to_dataframe()

我想要的是避免写入然后读取文件。类似于:

代码语言:javascript
复制
grib = r.content.decode()

代码语言:javascript
复制
xr_set = xr.load_dataset(r.content, engine="cfgrib")

这两者都提供了:

代码语言:javascript
复制
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd7 in position 95: invalid continuation byte

我也尝试过:

代码语言:javascript
复制
grib = resp.content.decode(errors='ignore')
xr_set = xr.open_dataset(grib, engine="cfgrib")

这就给出了:

代码语言:javascript
复制
ValueError: embedded null character

以及尝试不同的二进制编码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-26 14:07:10

我检查了cfgrib代码,特别是open_file方法,它似乎只接受str或os.PathLikestr对象。因此,r.content被读取为路径,然后它就出错了。如果您不想永久存储文件,可以尝试:

代码语言:javascript
复制
import os

import requests
import xarray as xr
from fs.tempfs import TempFS


def download_and_read_grib(url) -> xr.Dataset:
    with TempFS() as tempfs:
        with requests.get(url) as r:
            path = os.path.join(tempfs._temp_dir, "data.grb")
            with open(path, 'wb') as f:
                f.write(r.content)
            ds = xr.open_dataset(path, engine='cfgrib').load()
    return ds


download_and_read_grib('https://tgftp.nws.noaa.gov/SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.neast/VP.001-003/ds.wspd.bin')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68938395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档