web-dev-qa-db-ja.com

絶対システムパスにダウンロードするのではなく、オブジェクトとしてS3ファイルを取得する

S3の学習と使用を始めたばかりです。ドキュメントを読んでください。実際には、S3からダウンロードする代わりに、ファイルをオブジェクトにフェッチするためのものが見つかりませんでしたか?これが可能であるか、何か不足していますか?

実際、私はファイルのダウンロード後に追加のIOを避けたいです。

16
Bruce_Wayne

次のように、StringIOを使用し、get_contents_as_stringを使用してS3からファイルコンテンツを取得できます。

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

Boto3 S3クライアントのget_object()メソッドを探している可能性があります。

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

これにより、BodyオブジェクトであるメンバーStreamingBodyを含む応答オブジェクトディクショナリが得られます。これは、通常のファイルとして使用でき、その上で.read()メソッドを呼び出すことができます。 S3オブジェクトのコンテンツ全体をメモリに取得するには、次のようにします。

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

私はこのアプローチを好む 前の答え と同等:

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

しかし、別のアプローチでは、オブジェクトを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