检索 S3 文件作为对象而不是下载到绝对系统路径

Retrieve S3 file as Object instead of downloading to absolute system path

我刚开始学习和使用 S3,请阅读文档。实际上我没有找到任何东西来将文件提取到对象中而不是从 S3 下载它?如果这是可能的,或者我遗漏了什么?

实际上我想避免下载文件后的额外IO。

您可以使用 StringIO 并使用 get_contents_as_string 从 S3 获取文件内容,如下所示:

import pandas as pd
from io 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))

您可能正在寻找 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()

我更喜欢这种方法,等同于:

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