我很可能会这么做,所以我很乐意接受建议......
我的想法是,我(尝试)将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'))
来解决问题,现在一切都很好。
再次感谢!
答案 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