Эквивалентно get_contents_to_file в boto3

В boto3 существует ли эквивалент get_contents_to_file , который копирует содержимое объекта в дескриптор файла?

В boto, если у меня есть key объекта S3, я могу скопировать содержимое во временный файл с помощью:

 from tempfile import TemporaryFile key = code_that_gets_key() with TemporaryFile() as tmp_file: key.get_contents_to_file(key, tmpfile) 

Я не нашел эквивалента в boto3.

Я смог заменить использование get_contents_to_filename download_file . Однако это касается случая, когда я предоставляю имя файла. В этом случае я хочу предоставить дескриптор файла в качестве аргумента.

В настоящее время я могу заставить код работать в boto3, итерации по телу следующим образом:

 with TemporaryFile() as tmp_file: body = key.get()['Body'] for chunk in iter(lambda: body.read(4096), b''): filehandle.write(chunk) 

Есть ли лучший способ сделать это в boto3?

3 Solutions collect form web for “Эквивалентно get_contents_to_file в boto3”

Начиная с версии 1.4.0 есть функция download_fileobj которая делает именно то, что вы хотите. Согласно официальной документации:

 import boto3 s3 = boto3.resource('s3') bucket = s3.Bucket('mybucket') obj = bucket.Object('mykey') with open('filename', 'wb') as data: obj.download_fileobj(data) 

Операция также доступна для ресурса bucket и s3-клиента , например:

 import boto3 s3 = boto3.resource('s3') bucket = s3.Bucket('mybucket') with open('filename', 'wb') as data: bucket.download_fileobj('mykey', data) 

Правильным ответом будет использование NamedTemporaryFile вместо TemporaryFile:

 with NamedTemporaryFile() as tmp_file: file_name = tmp_file.name # This is what you are looking for 

Подробнее здесь: https://docs.python.org/2/library/tempfile.html

Ответ Питера правильный, но я хотел бы отметить, что в настоящее время большая часть AWS не имеет развернутого boto3 1.4, в первую очередь AWS Lambda.

Это не мешает вам обновляться «на лету», но если вы запускаете код на свежих установках, убедитесь, что

 boto3.__version__ >= '1.4.0' 

и обновите библиотеку, если нет. Надеюсь, что это будет исправлено в ближайшее время, и это будет спорным вопросом.

  • Загрузка с Amazon AWS S3 с использованием POST -
  • Как перечислить содержимое каталога в ведро S3 с помощью Python и Boto3?
  • Добавьте шаг потоковой передачи к заданию MR в boto3, работающем на AWS EMR 5.0
  • Как я могу получить доступ к низкоуровневому клиенту из экземпляра ресурса Boto 3?
  • Как использовать Boto3 для запуска экземпляра EC2 с ролью IAM?
  • Ресурсы и клиенты Boto3 эквивалентны? Когда используете одно или другое?
  • Простой способ сохранить содержимое ключа S3 в строке в boto3?
  • Завершить multipart_upload с помощью boto3?
  • Python - лучший язык программирования в мире.