使用python从谷歌云存储桶中删除数据时出错

Posted

技术标签:

【中文标题】使用python从谷歌云存储桶中删除数据时出错【英文标题】:Error while deleing data from google cloud bucket using python 【发布时间】:2021-09-06 03:58:58 【问题描述】:

我正在尝试从 google cloud bigquery 中删除存储桶数据:

        prefix = '122352346' + '202106'
        bucket = storage_client.get_bucket('test-bucket')
        bucket.delete_blobs(blobs=bucket.list_blobs(prefix=prefix))

存储桶存在,它也有前缀 122352346202106

在执行时,我收到以下错误:


Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/airflow/models/taskinstance.py", line 966, in _run_raw_task
    result = task_copy.execute(context=context)
  File "/usr/local/airflow/dags/bigquery/bigquery_data.py", line 205, in execute
    bucket.delete_blobs(blobs=bucket.list_blobs(prefix=prefix)))
  File "/usr/local/lib/python3.7/site-packages/google/cloud/storage/bucket.py", line 1622, in delete_blobs
    len(blobs),
TypeError: object of type 'HTTPIterator' has no len()

如何解决?

【问题讨论】:

【参考方案1】:

您应该尝试以不同的方式使用 blob 迭代器:

    prefix = '122352346' + '202106'
    bucket = storage_client.get_bucket('test-bucket')

    for blob_to_delete in bucket.list_blobs(prefix=prefix):
        bucket.delete_blobs(blob_to_delete)

【讨论】:

【参考方案2】: delete_blobs 中的

blob 参数查找包含要删除的 blob 名称的列表类型。

如果您查看传递给 blobs 参数的对象的类型,它不是列表类型,而是“google.api_core.page_iterator.HTTPIterator”。

因此,这将完成这项工作:

bucket.delete_blobs(blobs=list(bucket.list_blobs(prefix='sample/path')))

【讨论】:

以上是关于使用python从谷歌云存储桶中删除数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何从谷歌云存储中批量删除文件? (Node.js)

如何从谷歌云存储中的多个文件中删除扩展名?

从 Google 存储桶 IAM 政策中删除用户(身份)不起作用

使用 python 将历史数据从谷歌云存储移动到日期分区的 bigquery 表

使用 python 子进程在实例上运行 gsutil - 访问权限?

无法使用 python 将 JSON 文件从谷歌云存储加载到 bigquery