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.
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))
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()
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()