174 votes

Enregistrer Dataframe au format csv directement sur s3 Python

J'ai un fichier DataFrame que je souhaite télécharger dans un nouveau fichier CVS. Le problème est que je ne veux pas enregistrer le fichier localement avant de le transférer sur s3. Existe-t-il une méthode comme to_csv pour écrire le dataframe directement sur s3? J'utilise boto3.
Voici ce que j'ai jusqu'à présent:

 import boto3
s3 = boto3.client('s3', aws_access_key_id='key', aws_secret_access_key='secret_key')
read_file = s3.get_object(Bucket, Key)
df = pd.read_csv(read_file['Body'])

# Make alterations to DataFrame

# Then export DataFrame to CSV through direct transfer to s3
 

221voto

Stefan Points 19063

Vous pouvez utiliser:

 from io import StringIO
import boto3

csv_buffer = StringIO()
df.to_csv(csv_buffer)
s3_resource = boto3.resource('s3')
s3_resource.Object(bucket, 'df.csv').put(Body=csv_buffer.getvalue())
 

64voto

michcio1234 Points 579

J'aime s3fs qui vous permet d'utiliser (presque) s3 comme un système de fichiers local.

Tu peux le faire:

 import s3fs

bytes_to_write = df.to_csv(None).encode()
fs = s3fs.S3FileSystem(key=key, secret=secret)
with fs.open('s3://bucket/path/to/file.csv', 'wb') as f:
    f.write(bytes_to_write)
 

s3fs ne prend en charge que rb et wb modes d'ouverture du fichier, c'est pourquoi j'ai fait cela bytes_to_write .

16voto

mhawke Points 10385

Si vous passez None comme premier argument à to_csv() les données seront renvoyées sous forme de chaîne. À partir de là, il est facile de télécharger cela en une fois sur S3.

Il devrait également être possible de passer d'un objet StringIO à to_csv() , mais l'utilisation d'une chaîne sera plus facile.

-2voto

Veera Marni Points 59
    import boto3

    s3_client = boto3.client('s3',aws_access_key_id="AccessKey",aws_secret_access_key="Secretkey")

    head_response = s3_client.head_object(Bucket='YourBucket',Key='YourPath')

    if head_response['HTTPStatusCode'] == 200:
          Your operation if file exsits

-5voto

J'ai lu un CSV avec deux colonnes de Bucket S3 et le contenu du fichier CSV que j'ai mis dans Pandas Dataframe.

Exemple:

config.json

 {
  "credential": {
    "access_key":"xxxxxx",
    "secret_key":"xxxxxx"
}
,
"s3":{
       "bucket":"mybucket",
       "key":"csv/user.csv"
   }
}
 

cls_config.json

 #!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import json

class cls_config(object):

    def __init__(self,filename):

        self.filename = filename


    def getConfig(self):

        fileName = os.path.join(os.path.dirname(__file__), self.filename)
        with open(fileName) as f:
        config = json.load(f)
        return config
 

cls_pandas.py

 #!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd
import io

class cls_pandas(object):

    def __init__(self):
        pass

    def read(self,stream):

        df = pd.read_csv(io.StringIO(stream), sep = ",")
        return df
 

cls_s3.py

 #!/usr/bin/env python
# -*- coding: utf-8 -*-

import boto3
import json

class cls_s3(object):

    def  __init__(self,access_key,secret_key):

        self.s3 = boto3.client('s3', aws_access_key_id=access_key, aws_secret_access_key=secret_key)

    def getObject(self,bucket,key):

        read_file = self.s3.get_object(Bucket=bucket, Key=key)
        body = read_file['Body'].read().decode('utf-8')
        return body
 

test.py

 #!/usr/bin/env python
# -*- coding: utf-8 -*-

from cls_config import *
from cls_s3 import *
from cls_pandas import *

class test(object):

    def __init__(self):
        self.conf = cls_config('config.json')

    def process(self):

        conf = self.conf.getConfig()

        bucket = conf['s3']['bucket']
        key = conf['s3']['key']

        access_key = conf['credential']['access_key']
        secret_key = conf['credential']['secret_key']

        s3 = cls_s3(access_key,secret_key)
        ob = s3.getObject(bucket,key)

        pa = cls_pandas()
        df = pa.read(ob)

        print df

if __name__ == '__main__':
    test = test()
    test.process()
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X