【问题标题】:Google Cloud Storage List Blob objects with specific file nameGoogle Cloud Storage 列出具有特定文件名的 Blob 对象
【发布时间】:2020-07-08 17:21:40
【问题描述】:

在 google.cloud.storage 和 list_blobs 的帮助下,我可以从特定存储桶中获取文件列表。但我想过滤(名称* .ext)存储桶中的确切文件。我无法找到确切的解决方案。

例如:buket=data,prefix_folder_name=sales,在前缀文件夹中我有带有元数据的发票列表。我想获取具体的发票及其元数据(名称*.csv 和名称。*.meta)。此外,如果我循环特定文件夹的整个 all_blob 以获取所选文件,那么这将是大量数据并且可能会影响性能。

如果有人能帮我解决这个问题,那就太好了。

bucket = gcs_client.get_bucket(buket)
all_blobs = bucket.list_blobs(prefix=prefix_folder_name)
for blob in all_blobs: 
  print(blob.name)

【问题讨论】:

    标签: python google-cloud-storage client-library


    【解决方案1】:

    根据google-cloud-storage documentation,Blob 是具有name 属性的对象,因此您可以通过此属性对其进行过滤。

    from google.cloud import storage
    
    # storage_client = gcs client
    storage_client = storage.Client()
    
    # bucket_name = "your-bucket-name"
    # Note: Client.list_blobs requires at least package version 1.17.0.
    blobs = storage_client.list_blobs(bucket_name)
    
    # filter_dir = "filter-string"
    [blob.name for blob in blobs if filter_dir in blob.name ]
    

    【讨论】:

    • 问题中明确指出,仅获取所有对象并循环匹配过滤器将无法执行。
    【解决方案2】:

    它不允许你过滤,但你可以使用 fields 参数只返回对象的名称,限制返回的数据量,便于过滤。

    【讨论】:

      【解决方案3】:

      您可以过滤前缀,但要更具体地过滤(例如,对于以给定扩展名结尾的对象),您必须实现客户端过滤逻辑。这就是 gsutil 在您执行以下命令时所做的:

      gsutil ls gs://your-bucket/abc*.txt
      

      【讨论】:

        【解决方案4】:

        您可以使用以下过滤器,将过滤器视为文件的name.ext

        all_blobs = bucket.list_blobs()    
        fileList = [file.name for file in all_blobs if '.ext' in file.name and 'name' in file.name]
        
        for file in fileList: 
          print(file)
        

        这里name 将是文件名过滤器,.ext 将是您的扩展过滤器。

        【讨论】:

          猜你喜欢
          • 2014-01-28
          • 1970-01-01
          • 2023-03-12
          • 2019-06-29
          • 2021-03-07
          • 2021-04-14
          • 2014-09-08
          • 2020-06-19
          • 1970-01-01
          相关资源
          最近更新 更多