No boto 3, os métodos 'Key.set_contents_from_' foram substituídos por
Por exemplo:
import boto3
some_binary_data = b'Here we have some data'
more_binary_data = b'Here we have some more data'
# Method 1: Object.put()
s3 = boto3.resource('s3')
object = s3.Object('my_bucket_name', 'my/key/including/filename.txt')
object.put(Body=some_binary_data)
# Method 2: Client.put_object()
client = boto3.client('s3')
client.put_object(Body=more_binary_data, Bucket='my_bucket_name', Key='my/key/including/anotherfilename.txt')
Como alternativa, os dados binários podem vir da leitura de um arquivo, conforme descrito nos documentos oficiais comparando boto 2 e boto 3 :
Armazenamento de dados
Armazenar dados de um arquivo, stream ou string é fácil:
# Boto 2.x
from boto.s3.key import Key
key = Key('hello.txt')
key.set_contents_from_file('/tmp/hello.txt')
# Boto 3
s3.Object('mybucket', 'hello.txt').put(Body=open('/tmp/hello.txt', 'rb'))
s3.Object().put()
acabo com um objeto com zerocontent-length
. Para mim,put()
só aceita dados de string, masput(str(binarydata))
parece ter algum tipo de problemas de codificação. Acabo com um objeto com aproximadamente 3 vezes o tamanho dos dados originais, o que o torna inútil para mim.boto3 também tem um método para enviar um arquivo diretamente:
http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.upload_file
fonte
s3.Bucket(...).upload_fileobj()
método.Você não precisa mais converter o conteúdo em binário antes de gravar no arquivo no S3. O exemplo a seguir cria um novo arquivo de texto (chamado newfile.txt) em um intervalo S3 com conteúdo de string:
fonte
prefix
neste caso? Ou seja, e se você quiser armazenar o arquivo emmy-bucket-name/subfolder/
?Aqui está um bom truque para ler JSON de s3:
Agora você pode usar
json.load_s3
ejson.dump_s3
com a mesma APIload
edump
fonte
...["Body"].read().decode('utf-8')
.Uma versão mais limpa e concisa que uso para fazer upload de arquivos em tempo real para um determinado intervalo S3 e subpasta-
Nota : Você deve SEMPRE colocar suas credenciais AWS (
aws_access_key_id
eaws_secret_access_key
) em um arquivo separado, por exemplo-~/.aws/credentials
fonte
~
C:\Users\username\.aws\credentials
vale a pena mencionar o smart-open que usa
boto3
como back-end.smart-open
é um substituto imediato do python,open
que pode abrir arquivos des3
, bem comoftp
,http
e muitos outros protocolos.por exemplo
As credenciais do aws são carregadas por meio das credenciais do boto3 , geralmente um arquivo no
~/.aws/
diretório ou uma variável de ambiente.fonte
Você pode usar o código a seguir para escrever, por exemplo, uma imagem no S3 em 2019. Para poder se conectar ao S3, você terá que instalar o AWS CLI usando o comando e
pip install awscli
, em seguida, inserir algumas credenciais usando o comandoaws configure
:fonte