问题描述
在Python Google Cloud Function中尝试从内部将Google Cloud Storage文件的rowcount添加到元数据中。他遵循了官方Cloud Storage文档中的示例,尝试以与示例代码相同的方式更改属性:
from google.cloud import storage
def set_blob_metadata(bucket_name, blob_name):
"""Set a blob's metadata."""
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.get_blob(blob_name)
metadata = {'color': 'Red', 'name': 'Test'}
blob.metadata = metadata
blob.patch()
print("The metadata for the blob {} is {}".format(blob.name, blob.metadata))
但是在日志中,他的代码报错:
blob.size = 99 AttributeError: can't set attribute"
他想知道如何使用Python的google_cloud_storage包写入属性。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
解决方案1
根据用户提供的代码和错误信息,问题出在尝试直接设置blob.size
属性上。blob.size
是一个只读属性,无法直接设置。要写入元数据,需要使用blob.metadata
属性。
以下是一个修复后的示例代码:
from os import environ
from google.cloud import storage
def set_blob_metadata(bucket_name, blob_name):
"""Set a blob's metadata."""
storage_client = storage.Client()
bucket = storage_client.bucket(environ["BUCKET_NAME"])
blob = bucket.get_blob(environ["FILE_NAME_TEST"])
print("Size: {} bytes".format(blob.size))
print("Custom Time: {}".format(blob.custom_time))
metadata = {'rowcount': 99}
blob.metadata = metadata
blob.patch()
print("The metadata for the blob {} is {}".format(blob.name, blob.metadata))
在上面的示例中,我们将blob.size = 99
替换为metadata = {'rowcount': 99}
,然后将metadata
赋值给blob.metadata
属性。这样就可以成功写入元数据了。
请注意,blob.metadata
属性是一个字典,你可以根据需要添加其他属性。
解决方案2
在用户提供的最佳回答中,他解释了如何正确设置元数据。blob.metadata
属性是一个字典,你需要将要保存的属性添加到这个字典中。以下是他提供的示例代码:
def set_blob_metadata(bucket_name, blob_name):
"""Set a blob's metadata."""
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.get_blob(blob_name)
metadata = {'rowcount': 555}
blob.metadata = metadata
blob.patch()
print("The metadata for the blob {} is {}".format(blob.name, blob.metadata))
在上面的示例中,我们将metadata
设置为{'rowcount': 555}
,然后将其赋值给blob.metadata
属性。这样就可以成功写入元数据了。
请注意,blob.metadata
属性是一个字典,你可以根据需要添加其他属性。
总结
在Python的google_cloud_storage包中,要写入元数据,你需要将要保存的属性添加到blob.metadata
属性中。只有这个属性可以被填充,其他属性会报错AttributeError: can't set attribute
。