Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用云函数从Google云存储桶读取最新文件_Python_Google Cloud Platform_Google Cloud Functions_Google Cloud Storage_Client Library - Fatal编程技术网

Python 使用云函数从Google云存储桶读取最新文件

Python 使用云函数从Google云存储桶读取最新文件,python,google-cloud-platform,google-cloud-functions,google-cloud-storage,client-library,Python,Google Cloud Platform,Google Cloud Functions,Google Cloud Storage,Client Library,我面临的问题是,当我使用云函数中的python客户端库读取位于云存储桶中索引0处的文件时,云存储按字典顺序(字母顺序)对新添加的文件进行排序(使用云函数是我项目的一部分)并将数据放在BigQuery中,这对我来说很好,但新添加的文件并不总是显示在索引0处 流文件每天在不同的时间进入我的存储桶。 文件名相同(data-2019-10-18T14_20_00.000Z-2019-10-18T14_25_00.txt),但每个新添加的文件中文件名中的日期和时间字段不同 如何调整此python代码,以便

我面临的问题是,当我使用云函数中的python客户端库读取位于云存储桶中索引0处的文件时,云存储按字典顺序(字母顺序)对新添加的文件进行排序(使用云函数是我项目的一部分)并将数据放在BigQuery中,这对我来说很好,但新添加的文件并不总是显示在索引0处

流文件每天在不同的时间进入我的存储桶。 文件名相同(data-2019-10-18T14_20_00.000Z-2019-10-18T14_25_00.txt),但每个新添加的文件中文件名中的日期和时间字段不同

如何调整此python代码,以便在每次触发云函数时读取云存储桶中最新添加的文件

files = bucket.list_blobs()
fileList = [file.name for file in files if '.' in file.name]
blob = bucket.blob(fileList[0])   #reading file placed at index 0 in bucket

如果您拥有的云函数是由HTTP触发的,那么您可以用一个使用HTTP的函数替换它。如果它已经存在,那么你只需要利用它

任何时候触发函数时,您都可以检查事件类型并对数据执行任何操作,如:

从google.cloud导入存储
storage\u client=storage.client()
def hello_gcs_通用(数据、上下文):
“”“后台云功能将由云存储触发。
登记更多https://cloud.google.com/functions/docs/calling/storage#functions-调用存储python
"""
如果context.event\u type==storage.notification.OBJECT\u FINALIZE\u event\u type:
打印('Created:{}.format(data['timeCreated'])#此处用于说明
打印('Updated:{}'。格式(数据['Updated']))
blob=存储\u客户端。获取\u bucket(数据['bucket'])。获取\u blob(数据['name'])
#用blob做任何其他需要的事情

这样,您就不必关心对象是何时创建的。您知道,当创建客户端库时,您的客户端库代码会获取相应的blob,您可以对其执行任何操作。

如果您的目标是处理每一个(或大部分)上传的文件,那么@fhenrique的答案是更好的方法

但是,如果与文件上载速度相比,您的处理非常稀疏(或者如果您的要求不允许您切换到建议的云存储触发器),那么您需要仔细研究一下,为什么您没有满足在索引0位置找到最近上载的文件的期望

想到的第一个原因是您的文件命名约定。例如,让我们假设两个这样的文件:
data-2019-10-18T14_20_00.000Z-2019-10-18T14_25_00.txt
data-2019-10-18T14_25_00.000Z-2019-10-18T14_30_00.txt
。他们的 词典顺序为:

['data-2019-10-18T14_20_00.000Z-2019-10-18T14_25_00.txt',
 'data-2019-10-18T14_25_00.000Z-2019-10-18T14_30_00.txt']
请注意,最近上载的文件实际上是列表中的最后一个文件,而不是第一个。因此,您所要做的就是将索引
0
替换为索引
-1

其他一些可能的事情/理由要考虑(尝试打印<代码>文件名< /代码>确认/否认这些理论):

  • 您希望在索引
    -1
    位置找到的文件实际上没有完全上传和完成。我不确定在这种情况下你是否能做些什么——这只是管理期望的问题

  • 返回的文件列表实际上没有按字典顺序排序(无论出于何种原因)。我看到排序在中提到,但在API文档中没有提到。如果需要,在索引
    -1
    处拾取文件之前,显式排序
    文件列表

  • 如果该存储桶中的文件不符合上述命名规则(无论出于何种原因)-任何此类文件的名称位于最近上传的文件之后,将完全破坏您的算法。为了防止出现这种情况,您可以使用
    前缀
    以及
    分隔符
    可选参数来
    bucket.list_blobs()
    根据需要过滤结果。根据上述API文件:

  • 前缀(str)–(可选)用于过滤blob的前缀

  • 分隔符(str)–(可选)分隔符,与前缀一起用于模拟层次结构

这种过滤还可以根据当前日期/时间限制列表中的条目数量,这可能会大大加快函数的执行速度,特别是如果上载了很多这样的文件(您的命名建议表明可能有很多这样的文件)