【问题标题】:Pandas read_csv specify AWS ProfilePandas read_csv 指定 AWS 配置文件
【发布时间】:2022-04-21 16:50:27
【问题描述】:

Pandas (v1.0.5) 使用 s3fs 库连接 AWS S3 并读取数据。默认情况下,s3fs 使用在default 配置文件中的~/.aws/credentials 文件中找到的凭据。在从 S3 读取 CSV 时,如何指定 pandas 应该使用哪个配置文件?

例如。

s3_path = 's3://mybucket/myfile.csv'
df = pd.read_csv(s3_path)
$ cat ~/.aws/credentials
[default]
aws_access_key_id = ABCD
aws_secret_access_key = XXXX
[profile2]
aws_access_key_id = PQRS
aws_secret_access_key = YYYY
[profile3]
aws_access_key_id = XYZW
aws_secret_access_key = ZZZZ

编辑:

当前的破解/工作解决方案:

import botocore
import s3fs
session = botocore.session.Session(profile='profile2')
s3 = s3fs.core.S3FileSystem(anon=False, session=session)
df = pd.read_csv( s3.open(path_to_s3_csv) )

上述解决方案的唯一问题是您需要导入 2 个不同的库并实例化 2 个对象。保持问题开放,看看是否有另一种更清洁/简单的方法。

【问题讨论】:

  • 我相信你将不得不使用boto3下载csv文件,然后调用pd.read_csv()。
  • 是的,这是一种方式。我正在尝试查看是否可以 read_csv 而不在本地下载它。

标签: python pandas python-s3fs


【解决方案1】:
import s3fs
s3 = s3fs.S3FileSystem(anon=False, profile_name="your-profile-name")

我相信不要使用 boto,你可以使用 s3fs 的这个 S3FileSystem 部分。然后使用类似的文件处理程序:

with s3.open('bucket/file.txt', 'rb') as f:

【讨论】:

【解决方案2】:

如果您只需要使用一个配置文件,设置环境变量“AWS_DEFAULT_PROFILE”可以:

import os
os.environ["AWS_DEFAULT_PROFILE"] = "profile2"
df = pd.read_csv(path_to_s3_csv)

【讨论】:

    【解决方案3】:

    我不确定这是否“更好”,但它似乎对我直接使用 boto3 有效,无需使用 s3fs 或设置环境变量。

    import boto3
    import pandas as pd
    
    s3_session = boto3.Session(profile_name="profile_name")
    s3_client = s3_session.client("s3")
    df = pd.read_csv(s3_client.get_object(Bucket='bucket', Key ='key.csv').get('Body'))
    

    【讨论】:

      【解决方案4】:
      df = pd.read_csv(s3_path, storage_options=dict(profile='profile2'))
      

      【讨论】:

        【解决方案5】:

        如果您无法配置 .aws/config 文件:

        import pandas as pd
        import s3fs
        
        KEY_ID = 'xxxx'
        ACCESS_KEY = 'yyyy'
        BUCKET = 'my-bucket'
        fp = 's3://my-bucket/test/abc.csv'
        
        
        fs = s3fs.S3FileSystem(anon=False, key=KEY_ID, secret=ACCESS_KEY)
        with fs.open(fp) as f:
           df = pd.read_csv(f)
        

        【讨论】:

          猜你喜欢
          • 2019-12-22
          • 1970-01-01
          • 2022-10-19
          • 2013-10-27
          • 2016-06-10
          • 2018-07-07
          • 2017-11-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多