Python 试图将数据帧移动到S3存储桶时发生编码错误

Python 试图将数据帧移动到S3存储桶时发生编码错误,python,pandas,amazon-s3,character-encoding,Python,Pandas,Amazon S3,Character Encoding,我很可能会很难做到这一点,所以我非常愿意接受建议 我的想法是(尝试)将pd.DataFrame对象写入S3存储桶,以便将其复制到红移数据库。这是一个重要的问题: import gzip from io import StringIO, BytesIO from boto.s3.connection import S3Connection conn = S3Connection() bucket = conn.get_bucket('my-bucket') key = bucket.new_ke

我很可能会很难做到这一点,所以我非常愿意接受建议

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

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'
--->1键。从文件(gzfp)设置内容
/代理ssl中的usr/local/lib/python3.6/site-packages/boto/connection.py(self、host、port)
795 sock=socket.create_连接((self.proxy,int(self.proxy_端口)))
796 boto.log.debug(“代理连接:连接%s HTTP/1.0\r\n”,主机)
-->797 sock.sendall(“连接%s HTTP/1.0\r\n”%host)
798 sock.sendall(“用户代理:%s\r\n”%UserAgent)
799如果self.proxy_用户和self.proxy_通过:
TypeError:需要类似字节的对象,而不是“str”
我被难住了。为什么
gzfp
不是一个像字节一样的对象

提前感谢您的帮助

编辑:

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


再次感谢

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

$ conda install odo
下一步设置您的

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

from odo import odo
odo(df,'s3://path_to_csv_file.csv')

您可以使用以下任意格式转换
pd.Dataframe

代码不是在抱怨sendall吗?或者至少我不理解797的那条线。它似乎与gzfp没有任何关系。你知道,我想你已经了解了一些东西,这表明我已经关注这个问题太久了……Python 2.7上的sendall需要字符串,但3.6上的sendall需要字节。您是使用Python 2.7还是3.6运行代码?@Matt您需要GZ格式还是CSV格式?这看起来很有用,谢谢!然而,我不能在这个特殊的例子中使用它(至少不需要一些努力),因为我被降级到非常严格的公司playpen。设置凭据是个问题。不过,下次我会记住它,因为它看起来既漂亮又简单!由于
ODO
在内部使用
boto
,因此有多种方法设置凭据。检查您是否可以使用这两种方法之一