2010-06-29 5 views
43

J'ai besoin d'écrire un code en python qui va supprimer le fichier requis du seau amazon s3, je suis capable de faire des connexions au seau amazon s3 et aussi capable de sauvegarder des fichiers, je veux juste savoir comment supprimer un fichier ? S'il vous plaît aider si quelqu'un le sait.comment supprimer des fichiers du seau amazon s3?

+0

Quelle bibliothèque Python (le cas échéant) utilisez-vous pour la prise en charge de S3? Ou allez-vous directement aux interfaces REST ou SOAP dans votre code Python? –

+0

J'utilise la bibliothèque python boto.s3 – Suhail

Répondre

2

Par quelle interface? Utilisation de l'interface REST, vous venez send a delete:

DELETE /ObjectName HTTP/1.1 
Host: BucketName.s3.amazonaws.com 
Date: date 
Content-Length: length 
Authorization: signatureValue 

Via le SOAP interface:

<DeleteObject xmlns="http://doc.s3.amazonaws.com/2006-03-01"> 
    <Bucket>quotes</Bucket> 
    <Key>Nelson</Key> 
    <AWSAccessKeyId> 1D9FVRAYCP1VJEXAMPLE=</AWSAccessKeyId> 
    <Timestamp>2006-03-01T12:00:00.183Z</Timestamp> 
    <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature> 
</DeleteObject> 

Si vous utilisez une bibliothèque Python like boto, il devrait exposer une fonction "supprimer", comme delete_key().

+0

oui, j'utilise cette bibliothèque python, mais cela va-t-il supprimer le fichier? dois-je faire de cette façon: k.key = 'images/anon-images/petit /' + nom de fichier k.delete_key() est-ce correct? s'il vous plaît, faites-moi savoir. – Suhail

+0

@Suhail: Je n'ai pas utilisé cette bibliothèque, mais à partir de la source que j'ai liée, ce qu'elle fait est un appel 'DELETE' via l'interface REST. Donc oui, malgré le nom "delete_key" (que je suis d'accord n'est pas clair), c'est vraiment supprimer l'objet * référencé * par la clé. –

+1

Qu'en est-il de supprimer beaucoup de fichiers avec un préfixe commun dans le nom? Est-ce que S3 permet une suppression en bloc pour un tel cas, ou les supprimer un par un (ce qui est lent) est le must? –

1

Pour l'instant, j'ai résolu le problème en utilisant l'utilitaire Linux s3cmd. Je l'ai utilisé comme ceci en Python:

+1

Il n'est pas vraiment pythonique d'invoquer un sous-shell pour communiquer avec S3 (une bibliothèque ou une transaction HTTP directe serait plus élégante), mais cela fonctionne toujours. Je ne pense pas qu'il mérite une downvote. +1 –

+1

vraiment, ce n'est même pas faux – rbp

70

trouvé une autre façon de le faire en utilisant le boto:

from boto.s3.connection import S3Connection, Bucket, Key 

conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY) 

b = Bucket(conn, S3_BUCKET_NAME) 

k = Key(b) 

k.key = 'images/my-images/'+filename 

b.delete_key(k) 
+9

Si vous voulez supprimer TOUT dans un seau, vous pouvez faire: 'pour x dans b.list(): b.delete_key (x.key) ' – jontsai

+9

J'aime comment dans mon dossier il s'avère être' bucket.list() ' –

+0

Pour que cet extrait de code fonctionne comme présenté, vous devrez également importer' Bucket' et 'Key'. Comme dans: 'de boto.s3.connection importer S3Connection, Bucket, Key' –

3

Je suis surpris qu'il n'y a pas cette façon facile: key.delete():

from boto.s3.connection import S3Connection, Bucket, Key 

conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY) 
bucket = Bucket(conn, S3_BUCKET_NAME) 
k = Key(bucket = bucket, name=path_to_file) 
k.delete() 
10

Utilisation du Python boto3 SDK (et en supposant des informations d'identification sont configurés pour AWS), ce qui suit va supprimer un objet spécifié dans un seau:

import boto3 

client = boto3.client('s3') 
client.delete_object(Bucket='mybucketname', Key='myfile.whatever') 
+2

cela ne crée-t-il pas simplement un marqueur de suppression? – Rob

11

En utilisant boto3 (actuellement la version 1.4.4), utilisez S3.Object.delete().

import boto3 

s3 = boto3.resource('s3') 
s3.Object('your-bucket', 'your-key').delete()