相关疑难解决方法(0)

s3.upload_fileobj 给出错误,需要一个类似字节的对象

我的问题受到之前关于此主题的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)

非常感谢您的建议!

python amazon-s3 pandas

5
推荐指数
2
解决办法
2899
查看次数

将文件(如对象)保存到 s3 时出现错误:Unicode 对象必须在散列之前进行编码

这是我的代码。

import boto3
import pandas as pd
import requests
from io import StringIO

campaign_buffer=StringIO()

r = requests.get('https://.... output=csv....')

if r.status_code==200:
    r.encoding='utf-8'
    request_txt = r.text
    campaigns = StringIO(request_txt)
    campaigns_pd = pd.read_csv(campaigns, sep=",")
    campaigns_pd.columns=campaigns_pd.columns.str.replace(':','_')
    campaigns_pd.drop('images_thumb', inplace=True, axis=1)
    campaigns_pd.to_csv(campaign_buffer)
else:
    print('error')

bucket = 'name'
key = 'folder/test.csv'

client = boto3.client('s3')
client.upload_fileobj(campaign_buffer, bucket, key)
Run Code Online (Sandbox Code Playgroud)

最后一行代码导致错误:TypeError: Unicode-objects必须在散列之前进行编码

有什么想法如何解决这个问题吗?

python amazon-s3

4
推荐指数
1
解决办法
7177
查看次数

标签 统计

amazon-s3 ×2

python ×2

pandas ×1