S3 - это хранилище объектов, у него нет реальной структуры каталогов. «/» Довольно косметический. Одна из причин, по которой люди хотят иметь структуру каталогов, потому что они могут поддерживать / обрезать / добавлять дерево в приложение. Для S3 вы относитесь к такой структуре как к индексу или поисковому тегу.
Чтобы манипулировать объектом в S3, вам нужно boto3.client или boto3.resource, например. Чтобы перечислить весь объект
import boto3
s3 = boto3.client("s3")
all_objects = s3.list_objects(Bucket = 'my-bucket-name')
http://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.list_objects
Напоминание о boto3: boto3.resource - хороший API высокого уровня. Есть плюсы и минусы, использующие boto3.client vs boto3.resource. Если вы создаете внутреннюю общую библиотеку, то с помощью boto3.resource вы получите слой черного ящика над используемыми ресурсами.
int constrainedCount = yourSequence.Take(2).Count();
// if constrainedCount == 0 then the sequence is empty
// if constrainedCount == 1 then the sequence contains a single element
// if constrainedCount == 2 then the sequence has more than one element
Этот код берет отличный ответ LukeH и оборачивает его как расширение IEnumerable
, так что ваш код может работать с терминами None
, One
и Many
, а не 0
, 1
и 2
.
public enum Multiplicity
{
None,
One,
Many,
}
В статическом классе, например, EnumerableExtensions
:
public static Multiplicity Multiplicity<TElement>(this IEnumerable<TElement> @this)
{
switch (@this.Take(2).Count())
{
case 0: return General.Multiplicity.None;
case 1: return General.Multiplicity.One;
case 2: return General.Multiplicity.Many;
default: throw new Exception("WTF‽");
}
}
Один из способов - написать новый метод расширения
public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
using (var enumerator = enumerable.GetEnumerator()) {
if (!enumerator.MoveNext()) {
return false;
}
return !enumerator.MoveNext();
}
}
. При использовании linq для объектов SingleOrDefault выдает, если имеется более одного элемента, поэтому вам, вероятно, лучше, если вы бросите свой собственный.
РЕДАКТИРОВАТЬ : Теперь я видел ответ Люка, и должен сказать, что предпочитаю его. Жаль, что я сам об этом не подумал!
Другой способ:
bool containsMoreThanOneElement = yourSequence.Skip(1).Any();
Или для ровно 1 элемента:
bool containsOneElement = yourSequence.Any() && !yourSequence.Skip(1).Any();
Эффективный Count() == n
тест:
public static bool CountIsEqualTo<T>(this IEnumerable<T> enumerable, int c)
{
using (var enumerator = enumerable.GetEnumerator())
{
for(var i = 0; i < c ; i++)
if (!enumerator.MoveNext())
return false;
return !enumerator.MoveNext();
}
}
bool hasTwo = yourSequence.ElementAtOrDefault(1) != default(T);
... в случае класса, где значения могут быть нулевыми, это может быть полезно.