【问题标题】:Is there a way to access the contents of a NetCDF stored in a URL on Google Cloud Storage without downloading the file?有没有办法在不下载文件的情况下访问存储在 Google Cloud Storage 上的 URL 中的 NetCDF 的内容?
【发布时间】:2020-11-10 01:13:03
【问题描述】:

这是我第一次提出问题,如果我需要添加任何进一步的信息,请告诉我。

我正在尝试访问 Google Cloud Storage 上公共存储桶中的对象数据,但数据为 NetCDF 格式。我想提取数据并避免在本地下载数据。类似于netCDF4 库如何从使用 DAP 协议的 URL 访问数据。我需要能够同时访问多个链接中的数据,这样我就可以为我正在处理的一个更大的项目自动化 URL 链接。

Here is a link to one of the objects I will be using

如果您单击链接 URL,则文件将下载到 NetCDF。

我知道您可以使用 gsutil 或 HTTP 客户端(如请求)来获取链接,但之后有没有办法访问存储在 NetCDF 文件中的数据?

编辑:

这是我的代码使用下载的 NetCDF 文件的样子

输入:

import netCDF4 as nc
from netCDF4 import *

link = nc.Dataset('nwm.20200501_short_range_nwm.t00z.short_range.channel_rt.f001.conus.nc')
link

输出:

<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    featureType: timeSeries
    proj4: +proj=lcc +units=m +a=6370000.0 +b=6370000.0 +lat_1=30.0 +lat_2=60.0 +lat_0=40.0 +lon_0=-97.0 +x_0=0 +y_0=0 +k_0=1.0 +nadgrids=@
    model_initialization_time: 2020-05-01_00:00:00
    station_dimension: feature_id
    model_output_valid_time: 2020-05-01_01:00:00
    model_total_valid_times: 18
    stream_order_output: 1
    cdm_datatype: Station
    Conventions: CF-1.6
    code_version: v5.1.0-beta2
    NWM_version_number: v2.0
    model_output_type: channel_rt
    model_configuration: short_range
    dev_OVRTSWCRT: 1
    dev_NOAH_TIMESTEP: 3600
    dev_channel_only: 0
    dev_channelBucket_only: 0
    dev: dev_ prefix indicates development/internal meta data
    dimensions(sizes): feature_id(2729077), time(1), reference_time(1)
    variables(dimensions): int32 time(time), int32 reference_time(reference_time), |S1 crs(), int32 feature_id(feature_id), int32 streamflow(feature_id), int32 nudge(feature_id), int32 velocity(feature_id), int32 qSfcLatRunoff(feature_id), int32 qBucket(feature_id), int32 qBtmVertRunoff(feature_id)
    groups: 

我目前正在使用requests API,但我想知道是否可以使用此方法访问上述相同的数据?

import requests as req

r = req.get('https://storage.cloud.google.com/national-water-model/nwm.20200501/short_range/nwm.t00z.short_range.channel_rt.f001.conus.nc')

【问题讨论】:

    标签: python-requests google-cloud-storage netcdf gsutil


    【解决方案1】:

    所以有几个选项。如果您不需要登录,则较新版本的 netCDF-C 库可以使用字节范围请求直接通过 HTTP 读取数据——前提是在编译库时启用了此选项。 conda-forge(conda/Anaconda Python 生态系统的打包渠道)上可用的最新版本现已启用此功能。启用此功能后,您可以直接打开带有#mode=bytes 的url:

    from netCDF4 import Dataset
    
    url = ('https://storage.cloud.google.com/national-water-model/nwm.20200501/'
           'short_range/nwm.t00z.short_range.channel_rt.f001.conus.nc#mode=bytes')
    link = Dataset(url)
    

    现在我尝试使用您上面的 URL,但由于“未知文件格式”而失败,因为看起来 Google Cloud URL 需要身份验证。如果您能找到某种方法使用配置文件或环境变量将该身份验证传递给 libcurl,那么上面的代码可能会起作用。另一种选择是将文件内容下载到内存缓冲区中,然后打开它:

    import requests
    from netCDF4 import Dataset
    
    url = ('https://storage.cloud.google.com/national-water-model/nwm.20200501/'
           'short_range/nwm.t00z.short_range.channel_rt.f001.conus.nc#mode=bytes')
    data = requests.get(url).content
    link = Dataset('anynamehere', memory=data)
    

    【讨论】:

    • 无论如何都不会下载整个文件吗?
    • 没错。您所节省的只是手动/以编程方式下载文件并在磁盘上管理它。
    【解决方案2】:

    您问题中的措辞有点令人困惑。如果您正在访问文件的内容,那么您就是在下载它。

    我想拉取数据,避免在本地下载数据

    “提取数据”是什么意思?如果您的意思是访问内容,那 正在 下载它。如果您想查看对象的元数据,您可以发出 HTTP GET 调用以获取适当的元数据,或者根据您需要的信息,使用 curl 之类的东西对对象的 URL 发出 HEAD 请求.

    因为我将自动生成 URL 链接

    “自动化 URL 链接”是什么意思?您的意思是您将为用户自己下载对象生成 URL?如果是这样,您只需将存储桶和对象名称插入 GCS 的 storage.googleapis.com 端点,该端点旨在用于服务公共对象。格式为explained in the web docs,但通常遵循以下形式之一:

    https://<BUCKET>.storage.googleapis.com/<OBJECT>
    https://storage.googleapis.com/<BUCKET>/<OBJECT>
    

    【讨论】:

    • 感谢您要求澄清@mhouglum。我将编辑我的帖子以使其更有意义。简而言之,使用 netcdf4 和类似的 API,如果 URL 使用 DAP 协议,您可以访问文件的内容而无需下载文件,但是 GCS 上的 URL 是 HTTP。我想知道是否有一种方法可以访问文件中的内容而无需下载文件,类似于使用 netCDF4 API 可以完成的操作,在我的编辑中包含示例。
    • 通过自动化链接我的意思是我需要同时访问存储桶中的许多对象。由于不同的链接因数字增量而异,我可以创建一个程序来通过循环更改链接以获得我需要的链接。
    • 啊,我以前没听说过 DAP 协议。整洁的。查看 docs.opendap.org,您从中获取数据的服务器似乎需要支持 DAP;存储在 GCS 中的数据仅通过其 API 通过 HTTP 提供,而不是 DAP。要查看文件的内容,您必须下载它(完全或部分使用Range HTTP 标头),无论是将其存储到磁盘还是仅将其读入内存。如果您想要示例中的元数据,则需要将其作为自定义元数据存储在所需对象上:cloud.google.com/storage/docs/metadata#custom-metadata
    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2020-03-06
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2012-07-01
    相关资源
    最近更新 更多