Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

242
Vistas
s3 urls: obtenga el nombre y la ruta del depósito

Tengo una variable que tiene la url aws s3

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

Quiero obtener el nombre del depósito en una variable y descansar, es decir, /carpeta1/carpeta2/archivo1.json en otra variable. Probé las expresiones regulares y pude obtener el bucket_name como se muestra a continuación, no estoy seguro de si hay una mejor manera.

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

¿Cómo obtengo el resto, es decir, carpeta1/carpeta2/archivo1.json?

Verifiqué si hay una función de boto3 para extraer el nombre del depósito y la clave de la URL, pero no pude encontrarla.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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

 >>> from urlparse import urlparse >>> o = urlparse('s3://bucket_name/folder1/folder2/file1.json', allow_fragments=False) >>> 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 deba eliminar la barra inclinada inicial de la clave como sugiere la siguiente respuesta.

 o.path.lstrip('/')

Con Python 3 urlparse se movió a urllib.parse , así que use:

 from urllib.parse import urlparse

Aquí hay una clase que cuida todos los detalles.

 try: from urlparse import urlparse except ImportError: from urllib.parse import urlparse class S3Url(object): """ >>> s = S3Url("s3://bucket/hello/world") >>> s.bucket 'bucket' >>> s.key 'hello/world' >>> s.url 's3://bucket/hello/world' >>> s = S3Url("s3://bucket/hello/world?qwe1=3#ddd") >>> s.bucket 'bucket' >>> s.key 'hello/world?qwe1=3#ddd' >>> s.url 's3://bucket/hello/world?qwe1=3#ddd' >>> s = S3Url("s3://bucket/hello/world#foo?bar=2") >>> s.key 'hello/world#foo?bar=2' >>> s.url 's3://bucket/hello/world#foo?bar=2' """ def __init__(self, url): self._parsed = urlparse(url, allow_fragments=False) @property def bucket(self): return self._parsed.netloc @property def key(self): if self._parsed.query: return self._parsed.path.lstrip('/') + '?' + self._parsed.query else: return self._parsed.path.lstrip('/') @property def url(self): return self._parsed.geturl()
over 4 years ago · Santiago Trujillo Denunciar

0

Una solución que funciona sin urllib o re (también maneja la barra diagonal 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
over 4 years ago · Santiago Trujillo Denunciar

0

Para aquellos que, como yo, intentaban usar urlparse para extraer la clave y el cubo para crear un objeto con boto3. Hay un detalle importante: eliminar la barra diagonal del principio de la tecla

 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('/'))

Me tomó un tiempo darme cuenta de eso porque boto3 no arroja ninguna excepción.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda