2017-08-09 319 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也可以,谢谢。 –