首页 > 解决方案 > 尝试创建 s3 对象的本地缓存时没有此类文件错误

问题描述

我正在尝试使用 Fsspec 在 AWS s3 上的公共访问存储桶中创建数据文件存储的本地缓存。公共访问存储桶位于此处。

我 100% 有必要在本地文件缓存中执行此操作,因为这旨在扩展,我不想物理下载每个单独的文件。我正在尝试通过使用底层 botocore 框架的 API 调用 fsspec 来做到这一点。一个简单的、最小的可重现示例如下所示:

导入 fsspec

url = 'simplecache::s3://noaa-nbm-grib2-pds/blend.20211019/01/core/blend.20211019/01/core/blend.t01z.core.f001.co.grib2
'
of = fsspec.open_local(url, s3={'anon' : True}, filecache={'cache_storage':'/tmp/files'})

如果安装了所有依赖项,则运行上述会重现错误。我尝试使用文件的对应链接地址切换 url(simplecache 方案基于此处的一些 fsspec 文档),但仍然出现以下错误:

ValueError: open_local can only be used on a filesystem which has attribute local_file=True

是否有一个特定的 url 应该用于这样的事情?这是对象的直接 url(带有插入括号以防止链接立即下载文件)

# Remove parenthesis to get full file link which is a direct file download
https://noaa-nbm-grib2-pds.s3.amazonaws.com/blend.20211019/01/core/(blend.t01z.core.f001.co.grib2)

标签: pythonamazon-s3boto3fsspec

解决方案


以下工作正常:

fsspec.open_local("simplecache::https://noaa-nbm-grib2-pds.s3.amazonaws.com/blend.20211019/01/core/blend.t01z.core.f001.co.grib2")

但通过 s3 接口直接访问文件失败并显示 FileNotFound。这可能表明权限设置不正确,但 fsspec 的行为仍与您预期的一样。

>>> s3 = fsspec.filesystem("s3", anon=True)
>>> s3.info("s3://noaa-nbm-grib2-pds/blend.20211019/01/core/blend.20211019/01/core/blend.t01z.core.f001.co.grib2")
FileNotFoundError

推荐阅读