我想使用 gcsfs
连接到 Google Cloud 存储上的存储分区。到目前为止,我只使用了本机 google.cloud
模块,但事实证明我实际上需要某个应用程序的文件之类的对象,因此不得不切换。
我的 GOOGLE_APPLICATION_CREDENTIALS
环境变量指向我本地文件系统上的 JSON 文件。使用 google.cloud
,我可以毫无问题地访问云存储中的存储桶。但是使用 gcsfs
我不是。下面是一些代码来说明我的意思:
from google.cloud import storage
import gcsfs
import google.auth
storage_client = storage.Client()
bucket = storage_client.bucket(...)
blob = bucket.blob(f'data/audio_wav/test.wav')
bts = blob.download_as_bytes()
credentials, _ = google.auth.default()
fs = gcsfs.GCSFileSystem(project=..., token=credentials)
folders = fs.ls('data') #throws error
正如所评论的,最后一行抛出似乎是一个身份验证错误:
<块引用>google.auth.exceptions.RefreshError: ('invalid_scope: 提供的 OAuth 范围或 ID 令牌受众无效。', {'error': 'invalid_scope', 'error_description': '提供的 OAuth 范围或 ID 令牌受众无效。' })
我认为如果 google.cloud.storage
接受我的凭据,那么 gcsfs
也应该接受。为什么会出现上述错误,我该如何解决?
或者,有没有办法使用 google.cloud.storage
而不是 gcsfs
打开类似对象的文件?
{
"type": "service_account",
"project_id": ...,
"private_key_id": ....,
"private_key": ...,
"client_email": "ai-dj-884@ai-dj-76527.iam.gserviceaccount.com",
"client_id": "113487991001810308893",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/ai-dj-884%40ai-dj-76527.iam.gserviceaccount.com"
}
答案 0 :(得分:0)
正如@John Hanley 在评论中建议的那样,将身份验证模式(即“令牌”)从“token=credentials”修改为“token=None”,以使用您的默认 gcloud 凭据,或者尝试从 Google 获取凭据元数据服务,或回退到匿名访问。
有关详细信息,请参阅 Credentials。
要使用“google.cloud.storage”而不是“gcsfs”打开文件,您可以使用以下方法,
#create storage client
storage_client = storage.Client('json-file-path’')
#get bucket with name
bucket = storage_client.get_bucket('bucket-name')
#get bucket data as blob
blob = bucket.get_blob('file-name’)