【问题标题】:Loading files from s3 with subfolders with python使用python从s3加载带有子文件夹的文件
【发布时间】:2018-05-12 04:48:22
【问题描述】:

我正在尝试从 aws 中的 s3 存储桶加载 pandas 中的 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'])

【问题讨论】:

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


    【解决方案1】:

    您似乎混淆了存储桶、文件夹和对象键。您的代码应如下所示(其中 key 包含文件夹和文件名,bucket 仅包含 S3 存储桶名称):

    obj = s3.get_object(Bucket='bucketname', Key='folder1/folder2/filename.csv')
    

    【讨论】:

    • 我看了很多答案,也许我错过了其他的关键点,但你的答案是最清楚的,那就是 - 将假文件夹结构添加到文件中,而不是存储桶。谢谢!
    【解决方案2】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多