2015-06-13 2 views
3

Я пытаюсь читать CSV файл, расположенный в ведре AWS S3 в память как панды dataframe, используя следующий код:Как прочитать файл CSV из s3 ведра с использованием панд в Python

import pandas as pd 
import boto 

data = pd.read_csv('s3:/example_bucket.s3-website-ap-southeast-2.amazonaws.com/data_1.csv') 

В для того, чтобы дать полный доступ я установить политику ведро на ведро S3 следующим образом:

{ 
"Version": "2012-10-17", 
"Id": "statement1", 
"Statement": [ 
    { 
     "Sid": "statement1", 
     "Effect": "Allow", 
     "Principal": "*", 
     "Action": "s3:*", 
     "Resource": "arn:aws:s3:::example_bucket" 
    } 
] 

}

к сожалению, я все еще получаю следующее сообщение об ошибке в Python:

boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed 

Если вы хотите объяснить, как правильно установить разрешения в AWS S3 или правильно настроить pandas для импорта файла. Благодаря!

+0

не должны там быть двойной слэш после s3? –

+1

Да, вы правы, должно быть. Мне также пришлось изменить местоположение ведра и файла: tripData = pd.read_csv ('htps: //s3-ap-southeast-2.amazonaws.com/example_bucket/data.csv'). и мне пришлось обновлять разрешения для отдельного файла. но он работает сейчас. веселит. –

+1

Пожалуйста, добавьте свое решение в качестве ответа, чтобы помочь другим пользователям Stackoverflow. –

ответ

3

В конце концов я понял, что вам также необходимо установить права доступа на каждого отдельного объекта в ведре, чтобы извлечь его, используя следующий код:

from boto.s3.key import Key 
k = Key(bucket) 
k.key = 'data_1.csv' 
k.set_canned_acl('public-read') 

И я также должен был изменить адрес из ковш в команде pd.read_csv следующим образом:

data = pd.read_csv('https://s3-ap-southeast-2.amazonaws.com/example_bucket/data_1.csv') 
+0

Как изменить адрес, чтобы стать URL-адресом, который может быть прочитан пандами? –

2

Вам не нужно панд .. вы можете просто использовать CSV по умолчанию библиотеки питона в

def read_file(bucket_name,region, remote_file_name, aws_access_key_id, aws_secret_access_key): 
    # reads a csv from AWS 

    # first you stablish connection with your passwords and region id 

    conn = boto.s3.connect_to_region(
     region, 
     aws_access_key_id=aws_access_key_id, 
     aws_secret_access_key=aws_secret_access_key) 

    # next you obtain the key of the csv you want to read 
    # you will need the bucket name and the csv file name 

    bucket = conn.get_bucket(bucket_name, validate=False) 
    key = Key(bucket) 
    key.key = remote_file_name 
    data = key.get_contents_as_string() 
    key.close() 

    # you store it into a string, therefore you will need to split it 
    # usually the split characters are '\r\n' if not just read the file normally 
    # and find out what they are 

    reader = csv.reader(data.split('\r\n')) 
    data = [] 
    header = next(reader) 
    for row in reader: 
     data.append(row) 

    return data 

надеюсь, что он решил вашу проблему, удачи! :)

7

Использование панды 0.20.3

import os 
import boto3 
import pandas as pd 
import sys 

if sys.version_info[0] < 3: 
    from StringIO import StringIO # Python 2.x 
else: 
    from io import StringIO # Python 3.x 

# get your credentials from environment variables 
aws_id = os.environ['AWS_ID'] 
aws_secret = os.environ['AWS_SECRET'] 

client = boto3.client('s3', aws_access_key_id=aws_id, 
     aws_secret_access_key=aws_secret) 

bucket_name = 'my_bucket' 

object_key = 'my_file.csv' 
csv_obj = client.get_object(Bucket=bucket_name, Key=object_key) 
body = csv_obj['Body'] 
csv_string = body.read().decode('utf-8') 

df = pd.read_csv(StringIO(csv_string)) 
+0

Когда я импортирую его так, столбцы df не отображаются? –

+0

спасибо !! Я везде искал это – zbinsd