web-dev-qa-db-fra.com

Récupérer le fichier S3 en tant qu'objet au lieu de le télécharger vers le chemin système absolu

Je viens de commencer à apprendre et à utiliser S3, lisez les documents. En fait, je n'ai rien trouvé pour récupérer le fichier dans un objet au lieu de le télécharger à partir de S3? si cela pourrait être possible, ou je manque quelque chose?

En fait, je veux éviter d'autres IO après avoir téléchargé le fichier.

16
Bruce_Wayne

Vous pouvez utiliser StringIO et obtenir le contenu des fichiers de S3 en utilisant get_contents_as_string, comme ça:

import pandas as pd
import StringIO
from boto.s3.connection import S3Connection

AWS_KEY = 'XXXXXXDDDDDD'
AWS_SECRET = 'pweqory83743rywiuedq'
aws_connection = S3Connection(AWS_KEY, AWS_SECRET)
bucket = aws_connection.get_bucket('YOUR_BUCKET')

fileName = "test.csv"

content = bucket.get_key(fileName).get_contents_as_string()
reader = pd.read_csv(StringIO.StringIO(content))
13
ar-ms

Vous recherchez peut-être la méthode get_object() du client boto3 S3:

http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.get_object

Cela vous donnera un dictionnaire d'objets de réponse avec le membre Body qui est un objet StreamingBody, que vous pouvez utiliser comme fichier normal et appeler la méthode .read() dessus. Pour mettre tout le contenu de l'objet S3 en mémoire, vous feriez quelque chose comme ceci:

s3_client = boto3.client('s3')
s3_response_object = s3_client.get_object(Bucket=BUCKET_NAME_STRING, Key=FILE_NAME_STRING)
object_content = s3_response_object['Body'].read()
37
grepe

Je préfère cette approche, équivalente à ne réponse précédente :

import boto3
s3 = boto3.resource('s3')
def read_s3_contents(bucket_name, key):
    response = s3.Object(bucket_name, key).get()
    return response['Body'].read()

Mais une autre approche pourrait lire l'objet dans StringIO:

import StringIO
import boto3
s3 = boto3.resource('s3')
def read_s3_contents_with_download(bucket_name, key):
    string_io = StringIO.StringIO()
    s3.Object(bucket_name, key).download_fileobj(string_io)
    return string_io.getvalue()
15
Carl G