2016-05-07 7 views
2

Ich habe gerade angefangen zu lernen und S3 zu verwenden, lies die Dokumentation. Eigentlich habe ich nichts gefunden, um die Datei in ein Objekt zu holen, anstatt es von S3 herunterzuladen? ob das möglich sein könnte oder mir etwas fehlt?Abrufen der S3-Datei als Objekt anstelle des Herunterladens in den absoluten Systempfad

Eigentlich möchte ich zusätzliche IO nach dem Download der Datei vermeiden.

+0

Ist GetObject (siehe https://docs.aws.amazon.com/AmazonS3/latest/dev/RetrievingObjectUsingNetSDK.html) Hilfe? – sgmoore

Antwort

2

Sie könnten StringIO verwenden und Dateiinhalt von S3 mit get_contents_as_string erhalten, wie folgt aus:

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)) 
6

Sie könnten für die get_object() Methode des boto3 S3-Client suchen:

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

Dadurch erhalten Sie ein Antwortobjektverzeichnis mit Member Body, das ein StreamingBody-Objekt ist, das Sie als normale Datei verwenden undaufrufen könnenMethode darauf. Um den gesamten Inhalt des S3-Objekts in dem Speicher zu erhalten würden Sie so etwas tun:

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

Ich ziehe diesen Ansatz, das entspricht a previous answer:

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

Aber ein anderer Ansatz könnte das Objekt in StringIO lesen :

import StringIO 
import boto3 
s3 = boto3.resource('s3') 
string_io = StringIO.StringIO() 
s3.Object(bucket_name, key).download_fileobj(string_io) 
return string_io.getvalue()