使用python

时间:2017-11-28 16:32:29

标签: python amazon-web-services amazon-s3 boto boto3

我试图从aws中的s3存储桶加载psas中的csv文件。 Boto3似乎没有提供从子文件夹加载文件的功能。让我们说我在s3中有以下路径: bucket1 / bucketwithfiles1 / file1.csv

如何指定如何加载file1.csv?我知道s3没有目录结构。

import boto3
import pandas as pd

s3 = boto3.client('s3')
obj = s3.get_object(Bucket='/bucket1/creditdefault-ff.csv')

df = pd.read_csv(obj['Body'])

2 个答案:

答案 0 :(得分:2)

您似乎混淆了存储桶,文件夹和对象键。您的代码应该类似于这样(其中key包含文件夹和文件名,而bucket只包含S3存储桶名称):

  this.Bag(
                    r => "privatefieldtomap",
                    map =>
                        {
                            map.Access(Access.Field);
                            map.Table("table");
                            map.Key(k => k.Column("foreignkey"));
                        },
                    r => r.Element(m => m.Column("columntomap")));

答案 1 :(得分:0)

您在一个存储桶中可能有多个文件,每个文件都由一个密钥标识(这是S3中文件的路径)。因此,您希望在单个存储桶中获得所有文件(所有键)的数据框。

s3 = boto3.client('s3')
obj = s3.get_object(Bucket='my-bucket', Key='my-file-path')

df = pd.read_csv(obj['Body'])

如果您有多个文件,则需要结合使用名为list_object_v2的boto3方法(以在指定的存储桶中获取密钥),以及使用对获取到的密钥进行循环的get_object来获取所有文件。

然后,使用list_object_v2方法的Prefix参数在存储桶中的子文件夹上进行过滤可能会很有用。

每次都需要编写一些代码,因此您可以找到一个小型Python模块为您完成此工作,并获得诸如pandas_aws python包之类的额外功能:

from pandas_aws import get_client
from pandas_aws.s3 import get_df_from_keys

s3 = get_client('s3') # you can use your boto3 s3 client if you already hase instanciated one

df = get_df_from_keys(s3, "my-bucket", "my-subfolder/", suffix='.csv')

实际上,它调用相同的boto3方法,但根据提供的后缀过滤结果。 Dataframe的结构也是嵌入式的,并基于存储格式。

在此处查看软件包:https://github.com/FlorentPajot/pandas-aws