将pandas数据框写入S3存储桶(AWS)

14

我有一个AWS Lambda函数,它查询API并创建数据框,我想将这个文件写入S3存储桶,我正在使用:

import pandas as pd
import s3fs

df.to_csv('s3.console.aws.amazon.com/s3/buckets/info/test.csv', index=False)

我遇到了一个错误:

没有这个文件或目录:'s3.console.aws.amazon.com/s3/buckets/info/test.csv'

但是这个目录存在,因为我正在从那里读取文件。问题出在哪里呢?

我之前是这样读取文件的:

s3_client = boto3.client('s3')
s3_client.download_file('info', 'secrets.json', '/tmp/secrets.json')

我该如何将整个数据框上传到 S3 存储桶?


1
这个回答解决了你的问题吗?将Dataframe直接保存为csv到s3 Python - Asdfg
尝试使用以下代码将数据框保存为CSV文件到S3路径:df.to_csv('s3://info/test.csv', index=False) - Asdfg
我仍然得到之前相同的错误。 - Jonas Palačionis
你可以在这里找到答案:https://dev59.com/zloT5IYBdhLWcg3w0B-_ - Nandan Rana
3个回答

34

您也可以使用boto3包将数据存储到S3中:

from io import StringIO  # python3 (or BytesIO for python2)
import boto3

bucket = 'info'  # already created on S3
csv_buffer = StringIO()
df.to_csv(csv_buffer)

s3_resource = boto3.resource('s3')
s3_resource.Object(bucket, 'df.csv').put(Body=csv_buffer.getvalue())

我尝试了一下,没有出现任何错误,一切似乎都进行得很顺利,但是文件从未出现在存储桶中。你有什么想法吗?:< 上传需要时间吗?这是一个300MB的文件。我以为它至少会出现在存储桶的文件夹中。 - Raksha
@Raksha 是的,它可能需要一段时间,具体取决于您服务器上文件大小、CPU和RAM的情况。 - wowkin2
我等了整个周末,多次运行脚本,但仍然没有上传任何东西 :( 你有什么想法为什么会这样吗? - Raksha
1
@Raksha,你需要在上面的示例代码的最后一行添加一些try/except或详细日志记录,以便查看出错原因。可能存在某些错误默默地失败了。另一个选项是等待一段时间并在计算机上禁用互联网连接,以查看它在哪个步骤引发异常,以确定其卡在哪里。 - wowkin2

25

这不是S3 URI,你需要传递一个S3 URI才能保存到S3。此外,您不需要导入s3fs(只需要安装它即可)。

只需尝试:

"s3://info/test.csv"

保留原有的HTML标签。

import pandas as pd

df = pd.DataFrame()
# df.to_csv("s3://<bucket_name>/<obj_key>")

# In your case
df.to_csv("s3://info/test.csv")

注意:您需要先在AWS S3上创建存储桶。


9
为了使这个工作起来,需要安装s3fs包。 - Anton Pomieshchenko
是的,我没有明确说明,但当然,pandas会要求它,我会将其添加到答案中。 - null
有用的回答 @null,如果使用 AWS Lambda,如何安装 s3fs,谢谢? - pc_pyr
@pc_pyr 你可能会发现 这个页面 很有用。 - null

2
你可以使用AWS SDK for Pandas,这是一个扩展Pandas库以便与AWS数据存储平滑工作的库。
import awswrangler as wr
df = wr.s3.read_csv("s3://bucket/file.csv")

通过添加名为AWSSDKPandas-Python的层,该库可以在AWS Lambda中使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接