Как переименовать объекты в boto3 S3?

У меня около 1000 объектов в S3, названных в честь

abcyearmonthday1
abcyearmonthday2
abcyearmonthday3
...

хочу переименовать их в

abc/year/month/day/1
abc/year/month/day/2
abc/year/month/day/3

как я мог это сделать через бото3. Есть ли более простой способ сделать это?


person Hello lad    schedule 28.12.2015    source источник
comment
Избыточный вопрос. Проверь это. stackoverflow.com/questions/32501995/boto3-copy-object-s3   -  person mootmoot    schedule 07.04.2016


Ответы (3)


Как объяснено в Boto3 / S3: переименование объекта с помощью copy_object

вы не можете переименовать объект в S3, вам нужно скопировать объект с новым именем, а затем удалить старый объект

s3 = boto3.resource('s3')
s3.Object('my_bucket','my_file_new').copy_from(CopySource='my_bucket/my_file_old')
s3.Object('my_bucket','my_file_old').delete()
person Muhammad Rehman    schedule 13.02.2017

Прямого способа переименовать объект S3 не существует. Ниже необходимо выполнить два шага:

  1. Скопируйте объект S3 в то же место с новым именем.
  2. Затем удалите более старый объект.
person Dinesh Pundkar    schedule 27.07.2016

У меня была такая же проблема (в моем случае я хотел переименовать файлы, созданные в S3, с помощью команды Redshift UNLOAD). Я решил создать сеанс boto3, а затем скопировать-удалить файл за файлом.

Нравиться

import boto3

session = boto3.session.Session(aws_access_key_id=my_access_key_id,aws_secret_access_key=my_secret_access_key).resource('s3')

# Save in a list the tuples of filenames (with prefix): [(old_s3_file_path, new_s3_file_path), ..., ()] e.g. of tuple ('prefix/old_filename.csv000', 'prefix/new_filename.csv')
s3_files_to_rename = []
s3_files_to_rename.append((old_file, new_file))

for pair in s3_files_to_rename:
    old_file = pair[0]
    new_file = pair[1]

    s3_session.Object(s3_bucket_name, new_file).copy_from(CopySource=s3_bucket_name+'/'+old_file)
    s3_session.Object(s3_bucket_name, old_file).delete()
person enri    schedule 03.02.2019