这是我第一次提问,所以如果我需要添加任何进一步的信息,请告诉我。
我正在尝试访问 Google Cloud Storage 上公共存储桶中的对象数据,但数据采用 NetCDF 格式。我想提取数据并避免在本地下载数据。类似于
netCDF4
库如何从使用 DAP 协议的 URL 访问数据。我需要能够同时访问多个链接中的数据,以便我可以自动化我正在处理的较大项目的 URL 链接。
如果单击链接 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')
所以有几个选择。如果您不需要登录,则较新版本的 netCDF-C 库可以使用字节范围请求直接通过 HTTP 读取数据 - 前提是在编译库时启用了此选项。 conda-forge(conda/Anaconda Python 生态系统的打包渠道)上提供的最新版本现已启用此功能。启用此功能后,您可以直接打开带有
#mode=bytes
的网址:
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)
您问题中的措辞有点令人困惑。如果您正在访问文件的内容,则您正在下载它(“下载”意味着通过网络将对象的字节从 GCS 传输到您的主机,无论您是否将它们保存到磁盘上的文件中,打印它们到您的终端等)。
我想提取数据并避免在本地下载数据
“拉取数据”是什么意思?如果您的意思是访问内容,那就是下载它。如果您想查看对象的元数据,您可以进行 HTTP GET
调用来获取适当的元数据,或者根据您需要的信息,使用
curl
之类的内容针对对象的 URL 发出 HEAD
请求.
因为我将自动化 URL 链接“自动化 URL 链接”是什么意思?您的意思是您将生成供用户自行下载对象的 URL?如果是这样,您只需将存储桶和对象名称插入 GCS 的 storage.googleapis.com 端点,该端点旨在用于提供公共对象。格式在网络文档中进行了解释,但通常遵循以下形式之一:
https://<BUCKET>.storage.googleapis.com/<OBJECT>
https://storage.googleapis.com/<BUCKET>/<OBJECT>