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