2010-06-29 34 views
43

necesito escribir un código en python que elimine el archivo requerido de la categoría amazon s3, puedo hacer conexiones a la categoría amazon s3 y también puedo guardar archivos, solo quiero saber cómo eliminar un archivo ? por favor ayuda si alguien sabe.cómo eliminar archivos de Amazon S3 Bucket?

+0

¿Qué biblioteca de Python (si la hay) está utilizando para la compatibilidad con S3? ¿O vas directamente a las interfaces REST o SOAP en tu código Python? –

+0

estoy usando la biblioteca de python boto.s3 – Suhail

Respuesta

2

¿A través de qué interfaz? Usando la interfaz REST, que acaba de send a delete:

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

A través de la 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 está utilizando una biblioteca de Python like boto, se debe exponer a una función de "eliminar", como delete_key().

+0

sí, estoy usando esa biblioteca de Python, pero ¿eliminará eso el archivo? debo hacerlo de esta manera: k.key = 'images/anon-images/pequeña /' + nombre de fichero k.delete_key() es esto correcto? Por favor hagamelo saber. – Suhail

+0

@Suhail: No he usado esa biblioteca, pero desde la fuente que he vinculado, lo que en realidad está haciendo es una llamada 'DELETE' a través de la interfaz REST. Entonces sí, a pesar del nombre "delete_key" (que estoy de acuerdo no está claro), realmente está borrando el objeto * al que se hace referencia * por la clave. –

+1

¿Qué tal eliminar muchos archivos con un prefijo común en el nombre? ¿S3 permite alguna eliminación masiva para ese caso, o eliminarlos uno por uno (que es lento) es el deber? –

1

Por ahora he resuelto el problema utilizando la utilidad de Linux s3cmd. Lo utilicé como esto en Python:

+1

No es exactamente pitónico invocar una subshell para comunicarse con S3 (una biblioteca o una transacción HTTP directa sería más elegante), pero aún funciona. No creo que merezca un voto negativo. +1. –

+1

realmente, esto ni siquiera está mal – rbp

70

encontró una forma más de hacerlo mediante el 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 quisiera eliminar TODO en un cubo, podría hacer: 'para x en b.list(): b.delete_key (x.clave) ' – jontsai

+9

Me encanta cómo en mi archivo resulta ser' bucket.list() ' –

+0

Para que este fragmento de código funcione como se presentó, deberá importar' Bucket' y 'Key' también. Como en: 'desde boto.s3.connection import S3Connection, Bucket, Key' –

3

Me sorprende que no es así de fácil: 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

Utilizando el Python boto3 SDK (y suponiendo que las credenciales están configurados para AWS), lo siguiente será eliminar un objeto especificado en un cubo:

import boto3 

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

¿no crea esto simplemente un marcador de eliminación? – Rob

11

Usando boto3 (actualmente versión 1.4.4) use S3.Object.delete().

import boto3 

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