2017-03-07 2 views
6

Ich habe eine Variable, die die aws s3 url hats3 Urls - get Bucket-Namen und Pfad

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

ich die bucket_name in einer Variablen erhalten möchten und ruhen also /folder1/folder2/file1.json in einem anderen Variable. Ich habe die regulären Ausdrücke ausprobiert und könnte den Bucket_Name wie unten erhalten, nicht sicher, ob es einen besseren Weg gibt.

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

Wie erhalte ich den Rest d.h - folder1/folder2/file1.json?

Ich habe überprüft, ob es eine Boto3-Funktion gibt, um den Bucket_name und den Schlüssel aus der URL zu extrahieren, konnte sie aber nicht finden.

Antwort

10

Da es sich nur um eine normale URL handelt, können Sie urlparse verwenden, um alle Teile der URL abzurufen.

>>> 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' 

Mit Python 3 urlparse-urllib.parse bewegt, so verwenden:

from urllib.parse import urlparse 
+0

Vielen Dank. Genial!! –

1

Wenn Sie es mit regulären Ausdrücken tun möchten, können Sie Folgendes tun:

>>> 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' 

Dies hat die Vorteil, dass Sie für das Schema s3 überprüfen können, anstatt alles dort zu erlauben.

1

Für diejenigen, die mich mögen, versucht, URLparse zu verwenden, um Schlüssel und Eimer zu extrahieren, um ein Objekt mit Boto3 zu erstellen. Es ist ein wichtiges Detail: entfernen slash von Anfang an dem Schlüssel

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

Es dauerte eine Weile zu erkennen, dass da boto3 keine Ausnahme wirft.