将字节文件从AWS S3读取到AWS SageMaker conda_python3

时间:2018-12-14 15:50:47

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

早上好, 昨天我像这样将文件从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:无法将文件<_io.BytesIO> 0x7fcb0b403258>上的对象解释为泡菜

我尝试过:

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

我得到这个错误:

  

不支持的操作:文件号

我尝试过:

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

我得到这个错误:

  

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

如何读取此文件?

1 个答案:

答案 0 :(得分:0)

如先前评论中所建议,您可能希望将数据保存为已知的文件格式,以便从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()))