Rut*_*art 5 python amazon-s3 pandas
我的问题受到之前关于此主题的SO 的启发:在 Amazon Web Services (AWS) S3 中将 DataFrames 上传和保存为 csv 文件。使用 Python3,我想使用s3.upload_fileobj-分段上传 - 使数据传输到 S3 的速度更快。当我在接受的答案中运行代码时,我收到一条错误消息:“TypeError:需要一个类似字节的对象,而不是‘str’”。.
答案最近已被多次投票。所以我认为必须有一种方法可以在 Python3 中运行这段代码而不会出错。
请在代码下方找到。让我们轻松使用一个简单的 DataFrame。实际上,这个 DataFrame 更大(大约 500 MB)。
import pandas as pd
import io
df = pd.DataFrame({'A':[1,2,3], 'B':[6,7,8]})
Run Code Online (Sandbox Code Playgroud)
代码如下。为了方便起见,我将其转为函数:
def upload_file(dataframe, bucket, key):
"""dat=DataFrame, bucket=bucket name in AWS S3, key=key name in AWS S3"""
s3 = boto3.client('s3')
csv_buffer = io.BytesIO()
dataframe.to_csv(csv_buffer, compression='gzip')
s3.upload_fileobj(csv_buffer, bucket, key)
upload_file(df, your-bucket, your-key)
Run Code Online (Sandbox Code Playgroud)
非常感谢您的建议!
离开这个参考,似乎你需要gzip.GzipFile在你的周围包裹一个对象BytesIO,然后为你执行压缩。
import io
import gzip
buffer = io.BytesIO()
with gzip.GzipFile(fileobj=buffer, mode="wb") as f:
f.write(df.to_csv().encode())
buffer.seek(0)
s3.upload_fileobj(buffer, bucket, key)
Run Code Online (Sandbox Code Playgroud)
最小可验证示例
import io
import gzip
import zlib
# Encode
df = pd.DataFrame({'A':[1,2,3], 'B':[6,7,8]})
buffer = io.BytesIO()
with gzip.GzipFile(fileobj=buffer, mode="wb") as f:
f.write(df.to_csv().encode())
buffer.getvalue()
# b'\x1f\x8b\x08\x00\xf0\x0b\x11]\x02\xff\xd3q\xd4q\xe22\xd01\xd41\xe32\xd41\xd21\xe72\xd21\xd6\xb1\xe0\x02\x00Td\xc2\xf5\x17\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)
# Decode
print(zlib.decompress(out.getvalue(), 16+zlib.MAX_WBITS).decode())
# ,A,B
# 0,1,6
# 1,2,7
# 2,3,8
Run Code Online (Sandbox Code Playgroud)
Aks*_*hah -2
你可以尝试这样的事情。
import pandas as pd
import io
df = pd.DataFrame({'A':[1,2,3], 'B':[6,7,8]})
def upload_file(dataframe, bucket, key):
"""dat=DataFrame, bucket=bucket name in AWS S3, key=key name in AWS S3"""
s3 = boto3.client('s3')
csv_buffer = io.StringIO()
dataframe.to_csv(csv_buffer, compression='gzip')
csv_buffer.seek(0)
s3.upload_fileobj(csv_buffer, bucket, key)
upload_file(df, your-bucket, your-key)
Run Code Online (Sandbox Code Playgroud)