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
GCP云函数python-GCS复制文件-复制文件_Python_Google Cloud Platform_Google Cloud Functions - Fatal编程技术网

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('/')