使用Python Boto3跨S3桶移动文件时,如何移除源路径前缀直接将文件复制到目标桶根目录
使用Python Boto3跨S3桶移动文件时,如何移除源路径前缀直接将文件复制到目标桶根目录
我完全懂你的痛点!目前你的代码确实会把源桶里的Source-First/路径前缀一并复制到目标桶,导致文件都嵌套在子目录里,而你想要的是直接把这些Excel文件放到目标桶的根目录下。
问题出在这一行:
tgt.copy(CopySource, archive.key)
这里的archive.key包含了完整的源路径(比如Source-First/File1.xlsx),所以目标桶会直接沿用这个路径结构。我们需要做的就是提取出文件名部分,去掉前面的Source-First/前缀。
你可以通过字符串处理来实现这个需求,比如用split方法精准截取文件名。修改后的代码如下:
import boto3 bucket_from = "bucket-source" bucket_to = "bucket-target" source_prefix = "Source-First/" # 把前缀单独定义,方便后续修改 s3 = boto3.resource('s3') src = s3.Bucket(bucket_from) tgt = s3.Bucket(bucket_to) for archive in src.objects.filter(Prefix=source_prefix): if archive.key.endswith('.xlsx'): # 去掉源前缀,只保留文件名 target_key = archive.key.split(source_prefix, 1)[1] CopySource = {'Bucket': archive.bucket_name, 'Key': archive.key} tgt.copy(CopySource, target_key) archive.delete()
代码解释:
- 我把
Source-First/单独定义成了变量source_prefix,这样以后如果前缀变了,只需要改这一处就行,更灵活。 archive.key.split(source_prefix, 1)[1]会把源key按前缀分割成两部分,取第二部分就是纯文件名(比如Source-First/File1.xlsx分割后得到File1.xlsx)。- 这样
copy方法的第二个参数就变成了纯文件名,文件会直接复制到目标桶的根目录下,不会带任何前缀路径。
这样修改后,你的文件就会像预期的那样出现在bucket-target/File1.xlsx、bucket-target/File2.xlsx的位置啦!
备注:内容来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

