【问题标题】:Google Cloud Storage + Python : Any way to list obj in certain folder in GCS?Google Cloud Storage + Python:有什么方法可以在 GCS 的某个文件夹中列出 obj?
【发布时间】:2014-03-14 07:39:39
【问题描述】:

我要编写一个Python程序来检查文件是否在我的Google Cloud Storage的某个文件夹中,基本思想是获取文件夹中所有对象的list,文件名list ,然后检查文件abc.txt是否在文件名list中。

现在的问题是,看起来 Google 只提供了一种获取 obj list 的方法,即 uri.get_bucket(),请参见下面来自 https://developers.google.com/storage/docs/gspythonlibrary#listing-objects 的代码

uri = boto.storage_uri(DOGS_BUCKET, GOOGLE_STORAGE)
for obj in uri.get_bucket():
    print '%s://%s/%s' % (uri.scheme, uri.bucket_name, obj.name)
    print '  "%s"' % obj.get_contents_as_string()

uri.get_bucket() 的缺陷是,它看起来是先获取所有对象,这是我不想要的,我只需要获取特定文件夹的 obj 名称 list(例如 @987654333 @) ,应该很快。

有人可以帮忙解答吗?感谢每一个答案!

【问题讨论】:

    标签: python google-cloud-storage google-cloud-python gcloud-python


    【解决方案1】:

    更新:以下适用于 Python 的旧版“Google API 客户端库”,但如果您不使用该客户端,请选择较新的 Python 版“Google Cloud 客户端库”( https://googleapis.dev/python/storage/latest/index.html)。对于较新的库,等效于以下代码:

    from google.cloud import storage
    
    client = storage.Client()
    for blob in client.list_blobs('bucketname', prefix='abc/myfolder'):
      print(str(blob))
    

    老客户的回答如下。

    您可能会发现使用 JSON API 更容易,它有一个功能齐全的 Python 客户端。它有一个用于列出带有前缀参数的对象的功能,您可以使用它以这种方式检查某个目录及其子目录:

    from apiclient import discovery
    
    # Auth goes here if necessary. Create authorized http object...
    client = discovery.build('storage', 'v1') # add http=whatever param if auth
    request = client.objects().list(
        bucket="mybucket",
        prefix="abc/myfolder")
    while request is not None:
      response = request.execute()
      print json.dumps(response, indent=2)
      request = request.list_next(request, response)
    

    列表调用的更完整文档在这里:https://developers.google.com/storage/docs/json_api/v1/objects/list

    Google Python API 客户端记录在这里: https://code.google.com/p/google-api-python-client/

    【讨论】:

    • 您能建议如何定义客户端吗?我已经导入了json和apiclient,但是会抛出NameError: name 'client' is not defined,我查了文档没有找到这部分代码,谢谢!
    • 在上面添加了一些示例语法。
    • 有什么办法可以加快速度吗?数百万个 blob 会变慢
    【解决方案2】:

    这对我有用:

    client = storage.Client()
    BUCKET_NAME = 'DEMO_BUCKET'
    bucket = client.get_bucket(BUCKET_NAME)
    
    blobs = bucket.list_blobs()
    
    for blob in blobs:
        print(blob.name)
    

    list_blobs() 方法将返回一个迭代器,用于在存储桶中查找 blob。 现在您可以遍历 blob 并访问存储桶中的每个对象。在这个例子中,我只是打印出对象的名称。

    这份文档对我帮助很大:

    希望能帮到你!

    【讨论】:

    • 如果你想过滤特定文件夹中的文件,请使用bucket.list_blobs(prefix="path")
    • 适用于旧版本的 google api。谢谢
    【解决方案3】:

    您可能还想查看gcloud-pythondocumentation

    from gcloud import storage
    connection = storage.get_connection(project_name, email, private_key_path)
    bucket = connection.get_bucket('my-bucket')
    
    for key in bucket:
      if key.name == 'abc.txt':
        print 'Found it!'
        break
    

    但是,最好只检查文件是否存在:

    if 'abc.txt' in bucket:
      print 'Found it!'
    

    【讨论】:

    • 我在 Windows 7 上工作,我未能轻松安装 gcloud,最后它会以 警告结束:未找到 GMP 或 MPIR 库;不构建 Crypto.PublicKey._fastmath。错误:安装脚本退出并出现错误:无法找到 vcvarsall.bat,您能建议一下吗?谢谢!
    • 您是否安装了 PyCrypto 和所有这些?我相信这些的 Windows 安装程序可以在线获得。
    【解决方案4】:

    通过 pip 或 pycharm 安装 python 包 google-cloud-storage 并使用以下代码

    from google.cloud import storage
    client = storage.Client()
    for blob in client.list_blobs(BUCKET_NAME, prefix=FOLDER_NAME):
      print(str(blob))
    

    【讨论】:

      【解决方案5】:

      我知道这是一个老问题,但我偶然发现了这个问题,因为我正在寻找完全相同的答案。 Brandon Yarbrough 和 Abhijit 的回答对我有用,但我想了解更多细节。

      当你运行这个时:

      from google.cloud import storage
      storage_client = storage.Client()
      blobs = list(storage_client.list_blobs(bucket_name, prefix=PREFIX, fields="items(name)"))
      

      您将获得 Blob 对象,其中只有给定存储桶中所有文件的名称字段,如下所示:

      [<Blob: BUCKET_NAME, PREFIX, None>, 
       <Blob: xml-BUCKET_NAME, [PREFIX]claim_757325.json, None>, 
       <Blob: xml-BUCKET_NAME, [PREFIX]claim_757390.json, None>,
       ...]
      

      如果您像我一样想要 1) 过滤掉列表中的第一项,因为它不代表文件 - 它只是前缀,2) 只获取名称字符串值,以及 3) 删除 PREFIX从文件名中,您可以执行以下操作:

      blob_names = [blob_name.name[len(PREFIX):] for blob_name in blobs if blob_name.name != folder_name]
      

      仅从存储桶中获取字符串文件名的完整代码:

      from google.cloud import storage
      storage_client = storage.Client()
      blobs = list(storage_client.list_blobs(bucket_name, prefix=PREFIX, fields="items(name)"))
      blob_names = [blob_name.name[len(PREFIX):] for blob_name in blobs if blob_name.name != folder_name]
      print(f"blob_names = {blob_names}")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-25
        • 2015-04-16
        • 2017-11-25
        • 2021-07-27
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 2021-03-07
        相关资源
        最近更新 更多