web-dev-qa-db-fra.com

Lire un fichier csv depuis aws s3 en utilisant boto et pandas

J'ai déjà lu les réponses disponibles ici et ici et celles-ci n'aident pas.

J'essaie de lire un objet csv depuis S3 bucket et ont réussi à lire les données à l'aide du code suivant.

srcFileName="gossips.csv"
def on_session_started():
  print("Starting new session.")
  conn = S3Connection()
  my_bucket = conn.get_bucket("randomdatagossip", validate=False)
  print("Bucket Identified")
  print(my_bucket)
  key = Key(my_bucket,srcFileName)
  key.open()
  print(key.read())
  conn.close()

on_session_started()

Cependant, si j'essaie de lire le même objet en utilisant pandas comme trame de données, j'obtiens une erreur. La plus courante étant S3ResponseError: 403 Forbidden

def on_session_started2():
  print("Starting Second new session.")
  conn = S3Connection()
  my_bucket = conn.get_bucket("randomdatagossip", validate=False)
  #     url = "https://s3.amazonaws.com/randomdatagossip/gossips.csv"
  #     urllib2.urlopen(url)

  for line in smart_open.smart_open('s3://my_bucket/gossips.csv'):
     print line
  #     data = pd.read_csv(url)
  #     print(data)

on_session_started2()

Qu'est-ce que je fais mal? Je suis sur python 2.7 et je ne peux pas utiliser Python 3.

7
Drj

Voici ce que j'ai fait pour réussir à lire le df à partir d'un csv sur S3.

import pandas as pd
import boto3

bucket = "yourbucket"
file_name = "your_file.csv"

s3 = boto3.client('s3') 
# 's3' is a key Word. create connection to S3 using default config and all buckets within S3

obj = s3.get_object(Bucket= bucket, Key= file_name) 
# get object and file (key) from bucket

initial_df = pd.read_csv(obj['Body']) # 'Body' is a key Word
15
Drj

Cela a fonctionné pour moi.

import pandas as pd
import boto3
import io

s3_file_key = 'data/test.csv'
bucket = 'data-bucket'

s3 = boto3.client('s3')
obj = s3.get_object(Bucket=bucket, Key=s3_file_key)

initial_df = pd.read_csv(io.BytesIO(obj['Body'].read()))