Comment importer un fichier texte sur AWS S3 dans pandas sans écrire sur le disque

j'ai un fichier texte enregistré sur le S3 qui est une tabulation tableau. Je veux le charger dans pandas mais je ne peux pas le sauver en premier parce que je suis en cours d'exécution sur un serveur heroku. Voici ce que j'ai jusqu'à présent.

import io
import boto3
import os
import pandas as pd

os.environ["AWS_ACCESS_KEY_ID"] = "xxxxxxxx"
os.environ["AWS_SECRET_ACCESS_KEY"] = "xxxxxxxx"

s3_client = boto3.client('s3')
response = s3_client.get_object(Bucket="my_bucket",Key="filename.txt")
file = response["Body"]


pd.read_csv(file, header=14, delimiter="t", low_memory=False)

l'erreur est

OSError: Expected file path name or file-like object, got <class 'bytes'> type

Comment puis-je convertir le corps de réponse dans un format que pandas acceptera?

pd.read_csv(io.StringIO(file), header=14, delimiter="t", low_memory=False)

returns

TypeError: initial_value must be str or None, not StreamingBody

pd.read_csv(io.BytesIO(file), header=14, delimiter="t", low_memory=False)

returns

TypeError: 'StreamingBody' does not support the buffer interface

mise à JOUR - à l'Aide de la suite travaillé

file = response["Body"].read()

et

pd.read_csv(io.BytesIO(file), header=14, delimiter="t", low_memory=False)
28
demandé sur alpalalpal 2016-06-08 16:16:49

4 réponses

pandasbotoread_csv, donc vous devriez être en mesure de:

import boto
data = pd.read_csv('s3:/bucket....csv')

Si vous avez besoin d' boto3 parce que vous êtes sur python3.4+ vous pouvez

import boto3
import io
s3 = boto3.client('s3')
obj = s3.get_object(Bucket='bucket', Key='key')
df = pd.read_csv(io.BytesIO(obj['Body'].read()))
38
répondu Stefan 2017-11-23 17:01:14

s3fs c'est peut-être fait comme suit:

import s3fs
import pandas as pd
fs = s3fs.S3FileSystem(anon=False)

# CSV
with fs.open('mybucket/path/to/object/foo.pkl') as f:
    df = pd.read_csv(f)

# Pickle
with fs.open('mybucket/path/to/object/foo.pkl') as f:
    df = pd.read_pickle(f)
3
répondu Dror 2017-12-05 14:00:43

pandas peut gérer S3 Url. Vous pouvez simplement faire:

import pandas as pd
import s3fs

df = pd.read_csv('s3://bucket-name/file.csv')

Si le fichier S3 est privé, vous aurez besoin de votre configuration S3 configuration correctement.

1
répondu Wesam 2018-08-10 00:56:28

D'où, je suis venu avec cette ingénierie:

def create_file_object_for_streaming(self):
        print("creating file object for streaming")
        self.file_object = self.bucket.Object(key=self.package_s3_key)
        print("File object is: " + str(self.file_object))
        print("Object file created.")
        return self.file_object

for row in codecs.getreader(self.encoding)(self.response[u'Body']).readlines():
            row_string = StringIO(row)
            df = pd.read_csv(row_string, sep=",")

j'efface aussi le df une fois le travail terminé. del df

0
répondu aviral sanjay 2018-10-05 10:38:21