我试图从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'])
答案 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的结构也是嵌入式的,并基于存储格式。