Pandas read_csv укажите профиль AWS
Панды (v1.0.5) используют s3fs
библиотека для подключения к AWS S3 и чтения данных. По умолчанию s3fs использует учетные данные из~/.aws/credentials
файл в default
профиль. Как указать, какой профиль использовать pandas при чтении CSV из S3?
Например.
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 объекта. Оставить вопрос открытым, чтобы увидеть, есть ли другой более чистый / простой метод.
5 ответов
df = pd.read_csv(s3_path, storage_options=dict(profile='profile2'))
Если вам нужно использовать только один профиль, установка переменной среды "AWS_DEFAULT_PROFILE" работает:
import os
os.environ["AWS_DEFAULT_PROFILE"] = "profile2"
df = pd.read_csv(path_to_s3_csv)
import s3fs
s3 = s3fs.S3FileSystem(anon=False, profile_name="your-profile-name")
Я считаю, что не использовать boto, вы можете использовать эту часть S3FileSystem из s3fs. Затем с помощью обработчика файлов, например:
with s3.open('bucket/file.txt', 'rb') as f:
Я не уверен, что это «лучше», но, похоже, он работает для меня, используя boto3 напрямую, без необходимости использовать
s3fs
или установите переменную env.
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'))
Если вы не можете настроить файл .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)