尝试将DataFrame移动到S3存储桶的编码错误

时间:2017-02-28 12:05:43

标签: python pandas amazon-s3 character-encoding

我很可能会这么做,所以我很乐意接受建议......

我的想法是,我(尝试)将pd.DataFrame对象写入S3存储桶,以便将其复制到Redshift数据库。这是重要的一点:

import gzip
from io import StringIO, BytesIO
from boto.s3.connection import S3Connection

conn = S3Connection()
bucket = conn.get_bucket('my-bucket')
key = bucket.new_key('temp.gz')

fp, gzfp = StringIO(), BytesIO()

csvd = df.to_csv(fp, index=False, header=False)

fp.seek(0)

gzipped = gzip.GzipFile(fileobj=gzfp, mode='w')
gzipped.write(bytearray(fp.read(), 'utf-8'))
gzipped.close()

gzfp.seek(0)

key.set_contents_from_file(gzfp)

失败了:

----> 1 key.set_contents_from_file(gzfp)

    <snip>

    /usr/local/lib/python3.6/site-packages/boto/connection.py in proxy_ssl(self, host, port)
    795             sock = socket.create_connection((self.proxy, int(self.proxy_port)))
    796         boto.log.debug("Proxy connection: CONNECT %s HTTP/1.0\r\n", host)
--> 797         sock.sendall("CONNECT %s HTTP/1.0\r\n" % host)
    798         sock.sendall("User-Agent: %s\r\n" % UserAgent)
    799         if self.proxy_user and self.proxy_pass:

TypeError: a bytes-like object is required, not 'str'

我很难过。 gzfp 如何不是类似字节的对象?!?

提前感谢您的帮助!

编辑:

愚蠢的我!以下评论完全正确,非常感谢!通过将sendall中的boto.connection调用更改为sendall(bytearray('xxx', 'utf-8'))来解决问题,现在一切都很好。

再次感谢!

1 个答案:

答案 0 :(得分:0)

我建议您使用ODO Library。 (odo内部使用boto进行AWS操作)您可以使用

进行安装
from odo import odo
odo(df,'s3://path_to_csv_file.csv')

接下来设置AWS credentials

现在您可以使用odo将文件传输到S3。

pd.Dataframe

您可以使用以下任何格式转换{{1}}:Conversion Types