Как вывести список объектов по расширению из API S3? - PullRequest
5 голосов
/ 17 января 2011

Могу ли я как-то искать объекты в S3 по расширению, а не только по префиксу?

Вот что у меня сейчас:

ListObjectsResponse r = s3Client.ListObjects(new Amazon.S3.Model.ListObjectsRequest()
{
    BucketName = BucketName,
    Marker = marker,
    Prefix = folder, 
    MaxKeys = 1000
});

Итак, мне нужно перечислить все файлы * .xls в моем ведре.

Ответы [ 5 ]

8 голосов
/ 18 января 2011

Я не верю, что это возможно с S3.

Лучшее решение - «проиндексировать» S3 с использованием базы данных (Sql Server, MySql, SimpleDB и т. Д.) И выполнить ваши запросы на этот счет.

6 голосов
/ 29 декабря 2016

Хотя я думаю, что BEST ответ - использовать базу данных для отслеживания ваших файлов для вас, я также считаю, что это невероятная боль в заднице. Я работал в Python с Boto3, и это решение я придумал.

Это не элегантно, но будет работать. Перечислите все файлы, а затем отфильтруйте их до списка файлов с "суффиксом" / "расширением", которые вы хотите в коде.

s3_client = boto3.client('s3')
bucket = 'my-bucket'
prefix = 'my-prefix/foo/bar'
paginator = s3_client.get_paginator('list_objects_v2')
response_iterator = paginator.paginate(Bucket=bucket, Prefix=prefix)

file_names = []

for response in response_iterator:
    for object_data in response['Contents']:
        key = object_data['Key']
        if key.endswith('.json'):
            file_names.append(key)

print file_names
3 голосов
/ 20 февраля 2013

На самом деле вам не нужна отдельная база данных, чтобы сделать это для вас.

S3 дает вам возможность перечислять объекты в ведре с определенным префиксом. Ваша дилемма в том, что расширение «.xls» находится в конце имени файла, поэтому поиск по префиксу вам не поможет. Однако, когда вы помещаете файл в корзину, вы можете изменить имя объекта так, чтобы префикс содержал тип файла (например: XLS-myfile.xls). Затем вы можете использовать S3 API listObjects и передать префикс «XLS».

2 голосов
/ 08 апреля 2017

Я выполняю итерацию после получения информации о файле. Конечный результат будет в dict

import boto3

s3 = boto3.resource('s3')

bucket = s3.Bucket('bucket_name')

#get all files information from buket
files = bucket.objects.all()

# create empty list for final information
files_information = []

# your known extensions list. we will compare file names with this list
extensions = ['png', 'jpg', 'txt', 'docx']

# Iterate throgh 'files', convert to dict. and add extension key.
for file in files:
    if file.key[-3:] in extensions:
        files_information.append({'file_name' : file.key, 'extension' : file.key[-3:]})
    else:
        files_information.append({'file_name' : file.key, 'extension' : 'unknown'})


print files_information
1 голос
/ 19 февраля 2019

Потому что, используя ресурс boto3 для получения объектов из S3, вы можете получить удовлетворенный результат, используя возвращенное расширение файла для фильтрации того, что вы хотите.Вот так:

import boto3
s3 = boto3.resource('s3')
my_bucket = s3.Bucket('my_bucket')
files = my_bucket.objects.all()
file_list = []
for file in files:
    if file.key.endswith('.docx'):
         file_list.append(file.key)

Вы можете изменить строку концов с тем, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...