GCP云函数python-GCS复制文件-复制文件
我正在尝试将文件从地面军事系统复制到其他位置。但我需要用云计算功能实时处理它。 我创建了一个函数及其工作原理。但问题是,该文件使用多个文件夹复制了多次 如: 我的代码:GCP云函数python-GCS复制文件-复制文件,python,google-cloud-platform,google-cloud-functions,Python,Google Cloud Platform,Google Cloud Functions,我正在尝试将文件从地面军事系统复制到其他位置。但我需要用云计算功能实时处理它。 我创建了一个函数及其工作原理。但问题是,该文件使用多个文件夹复制了多次 如: 我的代码: 从google.cloud导入存储 def hello_gcs_通用(数据、上下文): sourcebucket=格式(数据['bucket']) 源文件=格式(数据['name']) 年份=源文件。拆分(“/”[1] 月=源文件。拆分(“/”[2] day=源文件。拆分(“/”[3] filename=source\u fil
从google.cloud导入存储
def hello_gcs_通用(数据、上下文):
sourcebucket=格式(数据['bucket'])
源文件=格式(数据['name'])
年份=源文件。拆分(“/”[1]
月=源文件。拆分(“/”[2]
day=源文件。拆分(“/”[3]
filename=source\u file.split(“/”[4]
印刷品(年)
打印(月)
打印(天)
打印(文件名)
打印(sourcebucket)
打印(源文件)
storage\u client=storage.client()
source\u bucket=存储\u客户端.bucket(sourcebucket)
source\u blob=source\u bucket.blob(source\u文件)
destination_bucket=存储_client.bucket(sourcebucket)
destination_blob_name='hivelog/year='+year+'/month='+month+'/day='+day+'/'+filename
blob\u copy=source\u bucket.copy\u blob(
源\u blob、目标\u bucket、目标\u blob\u名称
)
blob.delete()
印刷品(
“bucket{}中的Blob{}复制到bucket{}中的Blob{}。”.format(
source_blob.name,
source_bucket.name,
blob_copy.name,
目的地_bucket.name,
)
)
输出:
你可以看到这个year=year=2020
这是怎么来的?在这里面,我还有类似于year=year=2020/month=month=07/
我无法修复此问题。作为一个有根据的猜测,您从中复制的源路径的格式确实相同
/foo/year=2020/month=42/...
所以当你用斜线分开时,你会得到
foo
year=2020
month=42
当重新组合这些组件时,您再次添加另一个年=
/月=
/。。。前缀
destination\u blob\u name='hivelog/year='+year+'/month='+month+'。。。
现在你有了它<代码>年=年=年=经过3次迭代后
您还确定没有对已复制的文件进行迭代吗?这也会导致这种情况。您正在向尝试从中复制的同一个存储桶写入内容:
destination\u bucket=storage\u client.bucket(sourcebucket)
每次向bucket添加新文件时,它都会再次触发云功能
您需要使用两个不同的bucket,或者根据路径的第一部分添加一个条件:
top\u level\u directory=source\u file.split(“/”[0]
如果顶级目录==“mylog”:
#复印
elif顶级目录==“hivelog”:
#这是一个由函数创建的文件,不执行任何操作
其他:
#我们没想到会有这个顶级目录
这会让你在你想要完成的事情上领先一步。将项目名称替换为存储桶所在的GCP项目的名称
还假设您在一个json文件中设置了服务帐户凭据,其中包含环境变量GOOGLE_APPLICATION_credentials,我假设您使用的是GOOGLE.cloud存储
现在,您可以接受“mylog”或“hivelog”作为参数,并使其在其他场景中有用。同样,对于拆分文件名,如果您需要再次使用该路径,一行即可:
_,year,month,data,filename = data['name'].split('/')
在这种情况下,下划线只是用来告诉你自己和其他人你不打算使用分割的那一部分
可以使用扩展解包忽略多个值,例如
*_,month,day,filename = data['name'].split('/')
或者你可以把两者结合起来
*_,month,day,_ = data['name'].split('/')
编辑:到gcsfs文档我不是在重复答案对你有帮助吗?是@dustin ingram答案对我有帮助
*_,month,day,filename = data['name'].split('/')
*_,month,day,_ = data['name'].split('/')