You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:33:09