7

Quiero manipular un objeto python en escabeche almacenado en S3 en el sandbox de Google App Engine. Yo uso la sugerencia en el boto de documentation:¿Es posible leer un archivo de S3 en Google App Engine usando boto?

from boto.s3.connection import S3Connection 

from boto.s3.key import Key 

conn = S3Connection(config.key, config.secret_key) 
bucket = conn.get_bucket('bucketname') 
key = bucket.get_key("picture.jpg") 
fp = open ("picture.jpg", "w") 
key.get_file (fp) 

pero esto me obliga a escribir en un archivo, que al parecer no es kosher en la caja de arena GAE.

¿Cómo puedo evitar esto? Gracias mucho por cualquier ayuda

Respuesta

7

No es necesario escribir en un archivo o una StringIO en absoluto. Puede llamar al key.get_contents_as_string() para devolver el contenido de la clave como una cadena. Los documentos para la clave son here.

+0

gracias Nick. Esto funciona, y sin tener que importar el módulo StringIO. Creo que por razones obvias eso lo convierte en una mejor solución. Para cualquier persona que me siga en casa, cambié el pickle.load (contenido) a pickle.loads (contenido) para trabajar con el deshecho de un objeto tipo cadena, en lugar de un archivo. – rd108

+0

También sugiero usar validate = False a la llamada get_bucket - es decir, bucket = conn.get_bucket (bucket_name, validate = False) ya que boto intenta acceder al depósito, y fallará si no tiene acceso para hacerlo. para obtener más información, consulte: http://stackoverflow.com/questions/12571217/python-amazon-s3-cannot-get-the-bucket-says-403-forbidden –

+0

Además, las teclas boto tienen una llamada .open() que usted puedo usar. – meawoppl

3

Se puede escribir en una masa y utilizar el StringIO para recuperar los datos

from boto.s3.connection import S3Connection 
from boto.s3.key import Key 
from google.appengine.ext import db 

class Data(db.Model) 
    image = db.BlobProperty(default=None) 

conn = S3Connection(config.key, config.secret_key) 
bucket = conn.get_bucket('bucketname') 
key = bucket.get_key("picture.jpg") 
fp = StringIO.StringIO() 
key.get_file(fp) 

data = Data(key_name="picture.jpg") 
data.image = db.Blob(fp.getvalue()) 
data.put() 
+0

gracias, esto funciona. Usar StringIO fue una gran idea. – rd108