使用适用于Python的Google Cloud Client库从存储桶下载文件

时间:2019-08-21 17:53:01

标签: python google-cloud-platform google-cloud-storage

我尝试使用gsutil在存储桶中下载文件,但是现在想将下载内容合并到python脚本中以自动执行下载过程(用于下载特定日期的数据)。以下gsutil代码可以正常运行。

gsutil -m cp -r gs://gcp-public-data-goes-16/GLM-L2-LCFA/2019/001 C:\dloadFiles

使用我尝试过的存储客户端:

from google.cloud import storage
client = storage.Client()
with open('C:\dloadFiles') as file_obj:
     client.download_blob_to_file(
         'gs://gcp-public-data-goes-16/GLM-L2-LCFA/2019/001', file_obj)`

我收到错误消息“ DefaultCredentialsError:无法自动确定凭据。请设置GOOGLE_APPLICATION_CREDENTIALS或明确创建凭据并重新运行该应用程序。有关更多信息,请参阅https://cloud.google.com/docs/authentication/getting-started

这是一个公开可用的存储桶。

3 个答案:

答案 0 :(得分:2)

您尚未设置GOOGLE_APPLICATION_CREDENTIALS 遵循以下链接和设置凭据 https://stackoverflow.com/questions/45501082/set-google-application-credentials-in-python-project-to-use-google-api

设置凭据后,您的代码即可使用

答案 1 :(得分:0)

使用GCP凭据进行身份验证后,您还需要运行:

gcloud auth application-default

对您的应用程序SDK(例如Python客户端库)进行身份验证。然后,您将能够通过Python与GCP服务进行交互。 另外,您将使用gsutil命令复制整个文件负载,而不仅仅是像使用python那样复制文件。因此,您可能想先list_blobs,然后将其迭代下载到文件中。 另外,请检出blob.download_to_file,为您节省一些编码(docs here)。这样,您可以直接将blob发送到文件名,而无需先打开文件。

答案 2 :(得分:0)

首先,请在此存储桶上关闭公共设置,除非您确实需要将该存储桶公开。对于私人访问,您应该使用服务帐户(您的代码)或OAuth凭据。

如果您在Google Compute Service中运行此代码,则会自动发现凭据(ADC)。

如果您在Google Cloud之外运行,请更改以下行:

client = storage.Client()

对此:

client = storage.Client().from_service_account_json('/full/path/to/service-account.json')

您代码中的这一行正在尝试打开目录。这是不正确的。您需要指定文件名而不是目录名。您还需要指定写权限:

with open('C:\dloadFiles') as file_obj:

更改为

with open('c:/directory/myfilename', 'w')

或者对于二进制(数据)文件:

with open('c:/directory/myfilename', 'wb')

我假设此路径是文件Blob,而不是GCS上的“模拟”文件夹。如果这是文件夹,则需要将其更改为文件(存储对象blob)。

gs://gcp-public-data-goes-16/GLM-L2-LCFA/2019/001