如何在 xarray 的后端添加 fsspec.open_local

问题描述

在此处关注 Q xarray read remote grib file on s3 using cfgrib

我将如何转换以下代码以在 xarray 的 backend_kwargsopen_dataset 中使用。

import fsspec
import xarray as xr

uri = "simplecache::s3://mf-nwp-models/arpege-world/v2/2021-02-16/00/UGrd/10m/0h.grib2"

file = fsspec.open_local(uri,s3={'anon': True},filecache={'cache_storage':'/tmp/files'})

ds = xr.open_dataset(file,engine="cfgrib")

ds = xr.open_dataset(
    uri,engine="cfgrib",backend_kwargs=dict(s3={"anon": True},filecache={"cache_storage": "/tmp/files"}),)

但是得到ERROR:cfgrib.messages:Can't create file 'simplecache::s3://mf-nwp-models/arpege-world/v2/2021-02-16/00/UGrd/10m/0h.grib2.90c91.idx'

解决方法

抱歉,目前情况下这是不可能的。 xr.open_dataset 需要一个 URL,fsspec 可以将其转换为一个打开的类文件对象,或者一个本地路径。 open_local 的任务是处理 URL 并将字符串返回到本地副本 - 所以它不太适合。 fcgrib 通过尝试从它们中提取本地路径并(重新)打开它来处理打开的类文件对象。

在 fsspec 中有一个函数可以做 open_local 所做的事情,但返回一个打开的文件是合理的。请参阅 fsspec-reference-maker 上的讨论,了解我们如何通过在本地临时复制(许多)远程 grib2 来处理它们的打开。