2017-08-09 314 views
0

我的桶結構如下:獲取S3完整路徑文件

bucket 
    production 
     dt=2017-01-01 
      file1.json 
     ... 
     dt=2017-05-01 
      file2.json 

什麼我希望做的是得到的完整路徑file1.json,file2.json,所以我可以下載它們。

我努力做到這一點是蟒蛇。任何幫助表示讚賞。 TIA。

回答

4
s3 = boto3.client('s3') 

你可以通過調用list_objects

objs = s3.list_objects(Bucket='mybucket')['Contents'] 

使用列表理解列出的所有對象,獲得對象名稱忽略文件夾(其中有一個大小爲0)

[obj['Key'] for obj in objs if obj['Size']] 

或者

s3 = boto3.resource('s3') 
bucket = s3.Bucket('mybucket') 
[key.key for key in bucket.objects.all() if key.size] 

如果要列出與特定前綴的對象:

# S3 list all keys with the prefix 'photos/' 
s3 = boto3.resource('s3') 
bucket = s3.Bucket('production') 
    for obj in bucket.objects.filter(Prefix='2017-01-01/'): 
    if obj.size: print obj.key 
+0

噢!好的方法來忽略零長度的文件! –

+0

謝謝,但這得到的所有文件,因爲有分散的文件和其他目錄,我不想得到...如何做到這一點? –

+0

@ mr-sk看到我的更新。你可以使用'filter'作爲特定​​的文件夾。 – helloV

1

當對象的列表是從Amazon S3檢索,他們關鍵的對象始終是它的完整路徑:

import boto3 
s3 = boto3.resource('s3') 
for key in bucket.objects.all(): 
    print key.key 

結果:

production/dt=2017-01-01/file1.json 
production/dt=2017-01-01/file2.json 
production/dt=2017-05-01/file1.json 
production/dt=2017-05-01/file2.json 
+0

我想避免在這裏有其他文件。這將全部打印出來。我如何限制它到「dt」目錄? –

+0

「if」語句如何? '如果key.key.startswith('production/dt ='):print key.key' –

+0

是的,def也可以,謝謝。 –