Python 在GCP中对存储桶内容进行迭代,同时将数据流传输到其中

Python 在GCP中对存储桶内容进行迭代,同时将数据流传输到其中,python,google-cloud-storage,Python,Google Cloud Storage,我想在特定的时间点迭代存储桶的内容。我有以下代码来执行此操作: from google.cloud import storage client = storage.Client() bucket = client.get_bucket("my_bucket") blobs = bucket.list_blobs() for blob in blobs: if "old_name" in blob.name: # process fi

我想在特定的时间点迭代存储桶的内容。我有以下代码来执行此操作:

from google.cloud import storage
client = storage.Client()
bucket = client.get_bucket("my_bucket")
blobs = bucket.list_blobs()
for blob in blobs:
    if "old_name" in blob.name:
        # process file
然而,当我这样做的时候,物品会流入我的桶中。if语句在理论上意味着我不会处理任何正在流入的新文件,但是我担心迭代器不会包含所有blob,因为流入的新文件会以某种方式将其搞糟。你知道上面的代码是否可以工作,或者可能有问题,我遗漏了一些文件


我想迁移存储桶中的数据。我想确保我可以迁移 代码启动时桶中的所有项目。如果我迁移 项目到达后,它开始是好的,但我不能错过任何东西 那是在它开始之前

既然如此,你很好。这会奏效的。 例外情况是,如果新数据覆盖了您希望在访问之前复制的数据,但如果没有覆盖,这就可以了


但是迭代器是如何工作的,以至于我们知道它是可以的。 使用迭代器向列表中添加项不会改变其行为吗

正如文档中所示,
.list\u blobs
返回一个部分“脱机”的结果:它将使用API获取一页结果,并在每次请求中的iten被迭代时透明地获取更多页面。也就是说:在每N个项上发出一个新的阻塞HTTP请求,N是默认页面大小,但不是在迭代器上消耗的每个项上。如果没有显式设置
max\u results
,它看起来像是使用了API默认值。这意味着它将在整个迭代过程中发出一些请求,并且在这些请求之间添加的新文件将在最后显示,或者根本不显示-如果这些新文件会破坏结果获取,这将是一个非常错误的行为

事实上,如果操作人员将作为bucket的“实时视图”,每次迭代时获取一个项,那么它将相当复杂-使用API的应用程序必须具有某种并行性,无论是多线程还是异步,在其中,API代码可以在代码运行时运行和检索网络数据。这要求代码的工作要复杂一个数量级——当然,只有当它对API用户有利时才有意义。如果“实时内容更新”调用可用,那么复制源bucket中的更改不仅是它的职责,也是实现这种实现的唯一原因

TL;DR:只要去做就行了-当
.list\u blobs()返回时,您有一个对象可以迭代,并且包含一个本地(而不是“远程”)静态对象集,在处理调用时,该对象集存在于bucket中


我认为这可能更简单<代码>列表\u blobs
返回一个。为什么不在一开始就具体化blob列表,然后迭代它们呢?这样,您就不会看到任何新的blob添加到bucket中

从google.cloud导入存储
client=storage.client()
bucket=client.get_bucket(“我的_bucket”)
blobs=list(bucket.list\u blobs())
打印(类型(斑点))
>>> 

您能否澄清为什么需要这样做?因为如果你需要检查bucket中的更新,你可以使用另一种方法来完成。我想迁移bucket中的数据。我希望确保在代码启动时迁移bucket中的所有项。如果我迁移在它开始之后到达的项目,这是可以的,但是我不能错过它开始之前的任何东西,但是迭代器是如何工作的,这样我们就知道它是可以的。使用迭代器向列表中添加项不会改变其行为吗?我不认为是这样。如果您签入源代码,它将为您提供一个HTTP迭代器。你可以放心,它不会因为我在第二段到最后一段提到的原因而破裂。最多将在后台自动分页,但最多将包括在两次远程轮询之间到达的新iTen—正如我所说的:如果唯一的目的是在任何更新实际发生时中断,那么提供实时更新是没有意义的。如果您的用例是在第一次请求后严格禁止获取任何新文件,那么,是的,一些额外的控件是合适的。好的,谢谢您的帮助。我认为你总体上是对的,但我认为你的第二段是错的。list_blobs不会返回脱机结果,因为它返回HTTP迭代器。i、 e.当你想访问列表中的一个项目时,你仍然必须连接到互联网。检查那里的代码和文档后,就是这样:它返回一个迭代器,当需要时,当迭代时,它将透明地获取更多的结果页面。这将在每个第N次调用中发生一次,N是默认的结果页大小。否则,它会像我上面写的那样复杂,但这更简单,因为它会生成一个全新的阻塞HTTP请求