create aws python boto3

python - aws - URLs s3-obtener el nombre del cubo y la ruta



s3.bucket python (4)

Tengo una variable que tiene la url aws s3

s3://bucket_name/folder1/folder2/file1.json

Quiero obtener el nombre de cubo en una variable y descansar, es decir, /folder1/folder2/file1.json en otra variable. Probé las expresiones regulares y pude obtener el nombre de bucket como se muestra a continuación, sin estar seguro de que haya una forma mejor.

m = re.search(''(?<=s3:////)[^//]+'', ''s3://bucket_name/folder1/folder2/file1.json'') print(m.group(0))

¿Cómo obtengo el resto, por ejemplo, folder1 / folder2 / file1.json?

He comprobado si hay una característica de boto3 para extraer el nombre y la clave de bucket del url, pero no pude encontrarlo.


Para aquellos que, como yo, estaban tratando de usar urlparse para extraer la clave y el cubo para crear objetos con boto3. Hay un detalle importante: eliminar barra diagonal desde el principio de la clave

from urlparse import urlparse o = urlparse(''s3://bucket_name/folder1/folder2/file1.json'') bucket = o.netloc key = o.path boto3.client(''s3'') client.put_object(Body=''test'', Bucket=bucket, Key=key.lstrip(''/''))

Tomó un tiempo darse cuenta de eso porque boto3 no produce ninguna excepción.


Si quieres hacerlo con expresiones regulares, puedes hacer lo siguiente:

>>> import re >>> uri = ''s3://my-bucket/my-folder/my-object.png'' >>> match = re.match(r''s3:////(.+?)//(.+)'', uri) >>> match.group(1) ''my-bucket'' >>> match.group(2) ''my-folder/my-object.png''

Esto tiene la ventaja de que puede verificar el esquema s3 lugar de permitir que haya algo allí.


Una solución que funciona sin urllib o re (también maneja la barra inclinada anterior):

def split_s3_path(s3_path): path_parts=s3_path.replace("s3://","").split("/") bucket=path_parts.pop(0) key="/".join(path_parts) return bucket, key

Correr:

bucket, key = split_s3_path("s3://my-bucket/some_folder/another_folder/my_file.txt")

Devoluciones:

bucket: my-bucket key: some_folder/another_folder/my_file.txt


Ya que es solo una URL normal, puedes usar urlparse para obtener todas las partes de la URL.

>>> from urlparse import urlparse >>> o = urlparse(''s3://bucket_name/folder1/folder2/file1.json'') >>> o ParseResult(scheme=''s3'', netloc=''bucket_name'', path=''/folder1/folder2/file1.json'', params='''', query='''', fragment='''') >>> o.netloc ''bucket_name'' >>> o.path ''/folder1/folder2/file1.json''

Es posible que tenga que eliminar la barra diagonal inicial de la clave como sugiere la siguiente respuesta.

o.path.lstrip(''/'')

Con Python 3 urlparse movido a urllib.parse use:

from urllib.parse import urlparse