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)
4 réponses
pandas
boto
read_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()))
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)
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.
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