Как отфильтровать файлы glacier с помощью boto3?

#python-3.x #amazon-web-services #amazon-s3 #boto3 #aws-cli

#python-3.x #amazon-веб-сервисы #amazon-s3 #boto3 #aws-cli

Вопрос:

Я пишу скрипт для анализа файлов S3 buckets без необходимости загружать их локально. Кажется, код работает, поскольку он не находит файлы glacier. На данный момент я добавляю исключение (обработка ошибок выглядит лучше в реальном коде, я обещаю), но в идеале я хотел бы посмотреть, возможно ли отфильтровать файлы glacier.

Вот мой код:

 import boto3
import gzip
import os


try:
    s3_client = boto3.client('s3')
    bucket = 'my_bucket'
    prefix = 'path_to_file/file_name.csv.gz'
    obj = s3_client.get_object(Bucket=bucket, Key=prefix)
    body = obj['Body']
    with gzip.open(body, 'rt') as gf:
        for ln in gf:
            print(ln)
except Exception as e:
    print(e)
  

Я вижу, что с помощью AWS CLI я могу, по крайней мере, сортировать файлы так, как файлы glacier находятся внизу, поэтому должен быть способ отсортировать или отфильтровать их любым способом в boto3:

 aws s3api list-objects --bucket my-bucket --query "reverse(sort_by(Contents,amp;LastModified))"
  

Комментарии:

1. Случайно ли файл, который вы извлекаете, находится в glacier?

2. Я не знаю, но если это означает, что я не могу проверять их из корзины, это может быть. Я попытался открыть их с помощью утилиты ForkLift Archive Utility и оттуда тоже ничего не получилось. Можно загружать только локально

3. Вы хотите сказать, что можете загрузить CSV-файл с Amazon S3? Что отображается в консоли управления S3 в качестве класса хранилища объекта? Что произойдет, если вы повторно загрузите файл CSV и попробуете его с этим файлом? Это переопределило бы настройку Glacier.

4. да, я запутался. Я изменю вопрос, поскольку проблема была связана не с csv, а с файлами glacier.

Ответ №1:

Решается с помощью StorageClass == ‘STANDARD’ (vs == ‘GLACIER’):

 bucket = 'my_bucket'
prefix = 'path/to/files/'
s3_client = boto3.client('s3')
response = s3_client.list_objects(Bucket=bucket, Prefix=prefix)
for file in response['Contents']:
    if file['StorageClass'] == 'STANDARD':
        name = file['Key'].rsplit('/', 1)
        if name[1] != '':
            file_name = name[1]
            obj = s3_client.get_object(Bucket=bucket, Key=prefix   file_name)
            body = obj['Body']
            lns = []
            i = 0
            with gzip.open(body, 'rt') as gf:
                for ln in gf:
                    i  = 1
                    lns.append(ln.rstrip())
                    if i == 10:
                        break