Как отфильтровать файлы ледника с помощью boto3? - PullRequest
1 голос
/ 15 марта 2019

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

Вот мой код:

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, я могу, как минимум, сортировать файлы так, как файлы ледника находятся внизу, поэтому должен быть способВ любом случае сортируйте или фильтруйте их в boto3:

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

1 Ответ

0 голосов
/ 15 марта 2019

Решено с использованием 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
...