2015-09-10 12 views
26

Próbuję zmienić nazwę pliku w moim wiadrze s3 przy użyciu python boto3, nie mogłem dokładnie zrozumieć argumentów. Czy ktoś może mi tu pomóc?Boto3/S3: Zmienianie nazwy obiektu za pomocą copy_object

Co zamierzam skopiować obiekt do nowego obiektu, a następnie usunąć rzeczywisty obiekt.

Znalazłem podobne pytania tutaj, ale potrzebuję rozwiązania przy użyciu boto3.

Odpowiedz

34

znalazłem inne rozwiązanie

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() 
+6

Podoba mi się to rozwiązanie, dzięki. Wskazówka, jeśli ktoś ma takie samo potknięcie, jak ja. W pierwszym czytaniu przegapiłem, że klucz przekazany do CopySource * zawiera nazwę wiadra *. Najfajniejsze jest to, że oznacza to, że można kopiować między zasobnikami, ale zostałem rzucony, ponieważ próbowałem zmienić klucz w tym samym segmencie i nie myślałem o tym, aby go poprzedzić. Kiedy to zrobiłem, otrzymywałem błędy uprawnień zamiast bardziej sensownego błędu NoSuchBucket. To jeszcze bardziej mnie zdezorientowało! Mam nadzieję, że ludzie mogą teraz opuścić tę pułapkę. – t1m0

+2

Użyłem formatu słownikowego dla CopySource (format łańcucha nie działa dla mnie): 'CopySource = 'string' lub {'Bucket': 'string', 'Key': 'string', 'VersionId': 'string "} oparte na http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.copy_object – Kurtis

21

Nie można zmienić nazwy obiektów w S3, tak jak wskazano, trzeba go skopiować na nową nazwę, a następnie usunięty stary:

client.copy_object(Bucket="BucketName", CopySource="BucketName/OriginalName", Key="NewName") 
client.delete_object(Bucket="BucketName", Key="OriginalName") 
+0

dostaję następujący błąd: botocore.exceptions.ClientError: wystąpił błąd (NoSuchBucket) podczas wywoływania operacji CopyObject: Podany Łyżka nie istnieje I set Bucket = 'xyz-abc-yzd' gdzie '' xyz-abc-yzd 'jest moją nazwą zasobnika czy istnieje jakaś konwencja, której należy przestrzegać podczas ustawiania nazwy/klucza bucket? – MikA

+0

To samo wiadro, które mogę wyświetlić, używając 'list_buckets()' – MikA

+5

Może to zaoszczędzić trochę czasu innym użytkownikom. parametr 'CopySource' powinien zawierać' BucketName' i 'KeyName'. Tak więc 'OriginalName' NIE jest dokładnie tym kluczem obiektu. – Trein

1

Poniższe przykłady z zaktualizowanej dokumentacji Boto3 dla metody copy(), która również działa z copy_object() i wydaje się być wymaganą składnią teraz:

copy_source = {'Bucket': 'source__bucket', 'Key': 'my_folder/my_file'} 
s3.copy_object(CopySource = copy_source, Bucket = 'dest_bucket', Key = 'new_folder/my_file') 
s3.delete_object(Bucket = 'source_bucket', Key = 'my_folder/my_file') 

Uwaga związana z dokumentacją powyżej:

CopySource (dict) -- The name of the source bucket, key name of the source object, and optional version ID of the source object. The dictionary format is: {'Bucket': 'bucket', 'Key': 'key', 'VersionId': 'id'}. Note that the VersionId key is optional and may be omitted.

+0

To działało dla mnie. –

Powiązane problemy