Python 在AWS S3上将数据从一个文件夹移动/复制到另一个文件夹

Python 在AWS S3上将数据从一个文件夹移动/复制到另一个文件夹,python,amazon-s3,boto3,aws-cli,Python,Amazon S3,Boto3,Aws Cli,我正在寻找将数据从AWS S3 bucket上的一个文件夹移动/复制到另一个文件夹的所有方法 方法1:通过AWS CLI(最简单) 在您的实例上下载并安装awscli,我在这里使用windows()并运行“asw配置”来填充您的配置,只需在cmd上运行这个命令 aws s3 cp s3://from-source/ s3://to-destination/ --recursive 这里cp用于复制,递归用于复制所有文件 方法2:使用python通过AWS CLI import os imp

我正在寻找将数据从AWS S3 bucket上的一个文件夹移动/复制到另一个文件夹的所有方法


方法1:通过AWS CLI(最简单)

在您的实例上下载并安装awscli,我在这里使用windows()并运行“asw配置”来填充您的配置,只需在cmd上运行这个命令

aws s3 cp s3://from-source/ s3://to-destination/ --recursive
这里cp用于复制,递归用于复制所有文件


方法2:使用python通过AWS CLI

import os
import awscli
if os.environ.get('LC_CTYPE', '') == 'UTF-8':
    os.environ['LC_CTYPE'] = 'en_US.UTF-8'

from awscli.clidriver import create_clidriver
driver = create_clidriver()
driver.main('s3 mv s3://staging/AwsTesting/research/    s3://staging/AwsTesting/research_archive/ --recursive'.split())
import boto3
s3 = boto3.resource('s3')
copy_source = {
    'Bucket': 's3://staging/',
    'Key': 'AwsTesting/research/'
}
s3.meta.client.copy(copy_source, ''s3://staging/'', 'AwsTesting/research_archive/')
即使这样对我也很管用


方法3:使用python通过Boto

import os
import awscli
if os.environ.get('LC_CTYPE', '') == 'UTF-8':
    os.environ['LC_CTYPE'] = 'en_US.UTF-8'

from awscli.clidriver import create_clidriver
driver = create_clidriver()
driver.main('s3 mv s3://staging/AwsTesting/research/    s3://staging/AwsTesting/research_archive/ --recursive'.split())
import boto3
s3 = boto3.resource('s3')
copy_source = {
    'Bucket': 's3://staging/',
    'Key': 'AwsTesting/research/'
}
s3.meta.client.copy(copy_source, ''s3://staging/'', 'AwsTesting/research_archive/')
据我所知,我假设bucket的“key”只是文件夹前缀,所以我在这里提到了文件夹路径

错误:

无效的bucket name“s3://staging”:bucket name必须与regex“^[a-zA-Z0-9.-{1255}$”匹配

甚至我也把它改成了简单的bucket名称“staging”,但没有成功



如何理解通过boto的bucket连接以及该键的概念?

在CLI中使用
cp
的替代方法是
sync
-

import boto3
s3 = boto3.resource('s3')
copy_source = {
    'Bucket': 'staging',
    'Key': 'AwsTesting/research/filename.csv'
}
s3.meta.client.copy(copy_source, 'staging', 'AwsTesting/')

它基本上也会做同样的事情。

我在文档中看不到任何理由相信
s3.meta.client.copy
复制的不是单个对象。“将一个对象从一个S3位置复制到另一个S3位置。这是一种托管传输,必要时将在多个线程中执行多部分复制。”一个“多部分复制”并不意味着多个对象。这意味着使用多个HTTP事务复制单个对象,每个事务处理不同的字节范围。s3 bucket名称必须是全局唯一的,因此您不能拥有与其他人同名的bucket。。。到目前为止,如果没有人已经拥有一个名为“staging”的s3存储桶,我会非常惊讶!