#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