使用Python SDK更新Google存储中的Blob

使用Python SDK更新Google存储中的Blob,python,google-cloud-platform,google-cloud-storage,google-api-python-client,Python,Google Cloud Platform,Google Cloud Storage,Google Api Python Client,我想更新保存在谷歌云存储中的一个Blob,这个Blob在一个桶中,我是自己的。我想更新它的内容,这只是纯文本。我已经测试了很多次了,但是我没有得到它。我的代码是: from google.cloud import storage, exceptions BUCKET_NAME = 'my-bucket-name' BLOB_NAME = 'auditoria.txt' PROJECT_NAME = 'my-project-name' storage_cliente = storage.Clien

我想更新保存在谷歌云存储中的一个Blob,这个Blob在一个桶中,我是自己的。我想更新它的内容,这只是纯文本。我已经测试了很多次了,但是我没有得到它。我的代码是:

from google.cloud import storage, exceptions
BUCKET_NAME = 'my-bucket-name'
BLOB_NAME = 'auditoria.txt'
PROJECT_NAME = 'my-project-name'
storage_cliente = storage.Client() # I have a environment variable in windows for auth

def get_bucket_object():
"""Get a bucket"""
    bucket = None
    try:
        bucket = storage_cliente.get_bucket(BUCKET_NAME)
    except exceptions.NotFound:
        bucket = storage_cliente.create_bucket(bucket_or_name=BUCKET_NAME, project=PROJECT_NAME, location='us-east1')
    return bucket

def get_file_log():
    """Retorna un objeto de tipo BLOB presente en un bucket"""
    try:
        bucket = get_bucket_object()
        blob = bucket.get_blob(BLOB_NAME)
        if (blob == None):
            raise(Exception(f'El blob con nombre {BLOB_NAME} no existe, por favor creelo'))
        return blob
    except Exception as e:
        print(f"Ha ocurrido un error: {e}")

def write_log(msg):
    blob = get_file_log()
    print(blob.name)
    content_blob = blob.download_as_string().decode("utf-8")
    blob_txt = content_blob + '\n' + msg
    print(blob_txt)
    blob.upload_from_string(blob_txt)
    print("Blob actualizado correctamente")


write_log(
    'WARNING Esta es una prueba mas real'
)
我得到这个错误:

google.api_core.exceptions.BadRequest: 400 POST https://storage.googleapis.com/upload/storage/v1/b/auditorias_servihuella_cali/o?uploadType=multipart: ('Request fa
iled with status code', 400, 'Expected one of', <HTTPStatus.OK: 200>)
google.api_core.exceptions.BadRequest:400 POSThttps://storage.googleapis.com/upload/storage/v1/b/auditorias_servihuella_cali/o?uploadType=multipart: (‘请求fa’
iled,状态代码为',400',应为',)

所以我不知道我做错了什么?

最后,我得到了一个答案:

您不能更新以前在bucket中创建的对象(Blob),因为googlecloud中的对象是不可变的。这是谷歌文档的一部分:

对象是不可变的,这意味着上载的对象在其存储生存期内不能更改。对象的存储生存期是成功创建(上载)对象之间的时间间隔和成功删除对象。实际上,这意味着您无法对对象进行增量更改,例如追加操作或截断操作。”


此处有更多详细信息:

您当然可以上传新内容以完全替换现有对象,从而为其提供新版本。您只需修改一个对象,使其版本保持不变。你必须阅读那些文档中的内容:“然而,替换存储在云存储中的对象是可能的,这样做是原子性的”@DougStevenson你有上面提到的一些代码示例吗?