【问题标题】:Read bytes file from AWS S3 into AWS SageMaker conda_python3将字节文件从 AWS S3 读取到 AWS SageMaker conda_python3
【发布时间】:2019-05-15 21:58:03
【问题描述】:

早上好, 昨天我将一个文件从 SageMaker conda_python3 保存到 S3,如下所示:

s3 = boto3.client(
            's3',
            aws_access_key_id='XXXX',
            aws_secret_access_key='XXXX'
        )
y = pandas.DataFrame(df.tag_factor,index = df.index)
s3.put_object(Body = y.values.tobytes(), Bucket='xxx', Key='xxx')

今天我尝试用 conda_python3 作为 pandas.Series 或 numpy.array 对象打开它,代码如下:

s3 = boto3.client(
            's3',
            aws_access_key_id='XXX',
            aws_secret_access_key='XXX'
        )
y_bytes = s3.get_object(Bucket='xxx', Key='xxx')
y = numpy.load(io.BytesIO(y_bytes['Body'].read()))

但我收到此错误:OSError: Failed to translate file <_io.bytesio>object at 0x7fcb0b403258> as a pickle

我试过了:

y = numpy.fromfile(io.BytesIO(y_bytes['Body'].read()))

我得到这个错误:

不支持的操作:文件号

我试过了:

y = pd.read_csv(io.BytesIO(y_bytes['Body'].read()), sep=" ", header=None)

我得到这个错误:

EmptyDataError: 没有要从文件中解析的列

如何阅读此文件?

【问题讨论】:

  • 首先,请不要(永远)在您的笔记本中使用密钥。这不安全,会导致数据丢失和黑客侵入您的环境。您的笔记本有一个 IAM 角色,应该允许它访问您的 S3 存储桶。其次,使用文件作为从 S3 读写的中间位置。对于您的 python 代码和对文件/对象执行“s3 cp”或其他简单的 S3 命令都会更简单。

标签: python-3.x amazon-s3 amazon-sagemaker


【解决方案1】:

正如先前评论中所建议的,您可能希望将数据保存为已知的文件格式,以便从 S3 读取数据并将数据写入 S3。

例如,这里有一些代码将 pandas DataFrame 转换为 csv,将其保存在 S3 中,然后将文件从 S3 读回 DataFrame。

import pandas as pd 
import boto3 
import io 

df = pd.dataFrame(...) 
csv_buffer = io.StringIO() 
df.to_csv(csv_buffer, index=False) 
s3 = boto3.client('s3') 
bucket = 'mybucket' 
key = 'myfile.csv' 
s3.put_object(Body=csv_buffer.getvalue(), Bucket=bucket, Key=key) 

obj = s3.get_object(Body=csv_buffer.getvalue(), Bucket=bucket, Key=key) 
df2 = pd.read_csv(io.BytesIO(object['Body'].read())) 

【讨论】:

    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2015-08-30
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多