我正在对存储在GCS桶中的.csv文件运行Great Expectations验证。当验证运行时,它生成一组验证结果和数据文档,它们存储在不同的GCS桶中。如果验证成功,我想在验证数据的函数中删除这些文件,以保持我的桶精益并且更容易在其中导航。我已经确定了生成的blob名称的必要部分,它们是Great Expectations中的ValidationResultIdentifier的属性。然而,当我使用delete_blob函数时,我得到一个错误,blob不存在。它看起来像是函数插入了额外的字符,这些字符不是我的命名的一部分。
这是我的delete_blob函数
def delete_blob(bucket_name: str, blob_name: str) -> None:
"""Deletes a blob from a bucket
Args:
bucket_name (str): the bucket where the blob is located
blob_name (str): the blob to be deleted
"""
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(blob_name)
blob.delete()
以及我生成的json名称:
json_name = f'''
{VALID_RESULTS}/{runName}/{adjTime}/{batch_id[0]}.json'''
我得到了一个blob名称
validations/team/2022/1200/randomid.json
当我把我的桶名和这个blob名称放入delete blob函数时,我得到以下错误:
NotFound: 404 DELETE https://storage.googleapis.com/storage/v1/b/bucket/o/%0A%20%20%20%20validations%2Fteam%2F20220421-152311-raw-team-2022-04-21%2015%3A23%3A08.028947-data.csv%2F20220421T152311.141115Z%2Fbdbad345f0b11685beabf7f8a4e12a47.json?prettyPrint=false: No such object: bucket/
我已经将bucket.name记录到控制台,并确认桶名与我试图访问以删除blob的名称相匹配。我对blob名称本身也做了同样的处理。
我已经验证了在数据验证上工作的服务帐户具有对GCS的完全访问权限,事实上,我在另一个云函数中删除了我正在使用此delete_blob函数处理的.csv文件,没有问题。我还知道bucket确实存在,因为函数在该bucket中创建了文件。我正在试图找出错误URL的/o/%0A%20% %20% %20% %20部分来自哪里,但似乎无法破解。
问题来自您的blob名称。如果取部分%0A%20%20%20%20
,表示new line followed by 4 space character
就是这样:
json_name = f'''
{VALID_RESULTS}/{runName}/{adjTime}/{batch_id[0]}.json'''
像这样更改json_name应该可以解决问题
json_name = f'{VALID_RESULTS}/{runName}/{adjTime}/{batch_id[0]}.json'