services example aws python amazon-s3 cloud

example - ¿Cómo puedo acceder a los archivos s3 en Python usando urls?



boto3 python upload to s3 (5)

No he visto algo que funcionaría directamente con las URL de S3, pero podrías usar una biblioteca de acceso a S3 (parece simple) y algo de manipulación de cadena simple:

>>> url = "s3:/bucket/path/" >>> _, path = url.split(":", 1) >>> path = path.lstrip("/") >>> bucket, path = path.split("/", 1) >>> print bucket ''bucket'' >>> print path ''path/''

Quiero escribir un script de Python que leerá y escribirá archivos desde s3 usando su URL, por ejemplo: ''s3: / mybucket / file''. Tendría que ejecutarse localmente y en la nube sin ningún cambio de código. ¿Hay alguna forma de hacer esto?

Edit: Hay algunas buenas sugerencias aquí, pero lo que realmente quiero es algo que me permita hacer esto:

myfile = open("s3://mybucket/file", "r")

y luego usar ese objeto de archivo como cualquier otro objeto de archivo. Eso sería genial. Podría escribir algo como esto por mí mismo si no existe. Podría construir esa capa de abstracción en simples3 o boto.


Para abrir, debería ser tan simple como:

import urllib opener = urllib.URLopener() myurl = "https://s3.amazonaws.com/skyl/fake.xyz" myfile = opener.open(myurl)

Esto funcionará con s3 si el archivo es público.

Para escribir un archivo usando boto, va algo como esto:

from boto.s3.connection import S3Connection conn = S3Connection(AWS_KEY, AWS_SECRET) bucket = conn.get_bucket(BUCKET) destination = bucket.new_key() destination.name = filename destination.set_contents_from_file(myfile) destination.make_public()

Déjame saber si esto funciona para ti :)


Puede utilizar la API de Boto Python para acceder a S3 con python. Es una buena biblioteca. Después de realizar la instalación de Boto, el siguiente programa de ejemplo funcionará para usted

>>> k = Key(b) >>> k.key = ''yourfile'' >>> k.set_contents_from_filename(''yourfile.txt'')

Puede encontrar más información aquí http://boto.cloudhackers.com/s3_tut.html#storing-data


http://s3tools.org/s3cmd funciona bastante bien y es compatible con la forma s3: // de la estructura de URL que desea. Hace el negocio en Linux y Windows. Si necesita una API nativa para llamar desde un programa python, http://code.google.com/p/boto/ es una mejor opción.


Así es como lo hacen en awscli :

def find_bucket_key(s3_path): """ This is a helper function that given an s3 path such that the path is of the form: bucket/key It will return the bucket and the key represented by the s3 path """ s3_components = s3_path.split(''/'') bucket = s3_components[0] s3_key = "" if len(s3_components) > 1: s3_key = ''/''.join(s3_components[1:]) return bucket, s3_key def split_s3_bucket_key(s3_path): """Split s3 path into bucket and key prefix. This will also handle the s3:// prefix. :return: Tuple of (''bucketname'', ''keyname'') """ if s3_path.startswith(''s3://''): s3_path = s3_path[5:] return find_bucket_key(s3_path)

Lo que podrías usar con un código como este

from awscli.customizations.s3.utils import split_s3_bucket_key import boto3 client = boto3.client(''s3'') bucket_name, key_name = split_s3_bucket_key( ''s3://example-bucket-name/path/to/example.txt'') response = client.get_object(Bucket=bucket_name, Key=key_name)

Esto no aborda el objetivo de interactuar con una tecla s3 como un objeto similar a un archivo, sino que es un paso en esa dirección.