无法从Google云存储桶读取.json

时间:2018-10-03 13:00:51

标签: python-3.x google-cloud-storage

我在一个Google云存储桶中有一个文件夹结构

bucket_name = 'logs'
json_location = '/logs/files/2018/file.json'

我尝试使用此代码在json中读取此jupyter notebook文件

from google.cloud import storage 

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "logs/files/2018/file.json"

def download_blob(source_blob_name, bucket_name, destination_file_name): 
    """Downloads a blob from the bucket.""" 
    storage_client = storage.Client() 
    bucket = storage_client.get_bucket(bucket_name) 
    blob = bucket.blob(source_blob_name) 

    blob.download_to_filename(destination_file_name) 

    print('Blob {} downloaded to {}.'.format(
        source_blob_name, 
        destination_file_name)) 

然后调用函数

download_blob('file.json', 'logs', 'file.json')

我收到此错误

DefaultCredentialsError: File /logs/files/2018/file.json was not found.

我已经查看了所有关于stackoverflow的类似问题,但找不到解决方案。

存在json文件,可以在Google云存储上的json_location中打开或下载该文件。

2 个答案:

答案 0 :(得分:1)

GOOGLE_APPLICATION_CREDENTIALS应该指向运行jupyter的本地磁盘上的文件。您需要凭据才能调用GCS,因此无法从GCS中获取它们。

实际上,最好不要在程序中完全弄乱凭据,而要保留客户端库。不要在我们的应用程序中触摸GOOGLE_APPLICATION_CREDENTIALS。相反:

  • 如果您在GCE上运行,只需确保您的GCE实例[具有具有正确范围和权限的服务帐户]。在该实例中运行的应用程序将自动拥有该服务帐户的权限。
  • 如果您在本地运行,请安装google cloud SDK并运行gcloud auth application-default login。然后,您的程序将自动使用您登录时使用的任何帐户。

完整说明here

答案 1 :(得分:1)

关于您引用的json文件有两种不同的观点:

1)用于向GCP进行身份验证的json文件。

2)您要从存储桶下载到本地计算机的json。

对于第一个,如果您要远程访问Jupyter服务器,则很可能json不在此类远程计算机中,而是在您的本地计算机中。如果您的情况是这样,请尝试将json上传到Jupyter服务器。在远程计算机上执行ls -l /logs/files/2018/file.json可能有助于验证其正确性。然后,os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "JSON_PATH_ON_JUPYTER_SERVER"应该可以工作。

另一方面,我执行了您的代码并得到:

>>> download_blob('static/upload_files_CS.png', 'bucketrsantiago', 'file2.json')  
Blob static/upload_files_CS.png downloaded to file2.json.

文件gs://bucketrsantiago/static/upload_files_CS.png已下载到我的本地计算机,文件名为file2.json。这有助于弄清唯一的问题与身份验证json文件有关。