python - डेटाफ़्रेम को सीधे सेव करें S3 पायथन को




csv amazon-s3 (5)

मेरे पास एक पांडा डेटाफ़्रेम है जिसे मैं एक नई सीएसवी फ़ाइल में अपलोड करना चाहता हूं। समस्या यह है कि मैं फ़ाइल को स्थानीय रूप से s3 में स्थानांतरित करने से पहले सहेजना नहीं चाहता। क्या कोई तरीका है to_csv सीधे s3 को डेटाफ़्रेम लिखने के लिए? मैं boto3 का उपयोग कर रहा हूं।
यह है, जो कि अभी तक मेरे पास है:

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

आप उपयोग कर सकते हैं:

from io import StringIO # python3; python2: BytesIO 
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())

आप सीधे S3 पथ का उपयोग कर सकते हैं। मैं पंडों का उपयोग कर रहा हूं 0.24.1

In [1]: import pandas as pd

In [2]: df = pd.DataFrame( [ [1, 1, 1], [2, 2, 2] ], columns=['a', 'b', 'c'])

In [3]: df
Out[3]:
   a  b  c
0  1  1  1
1  2  2  2

In [4]: df.to_csv('s3://experimental/playground/temp_csv/dummy.csv', index=False)

In [5]: pd.__version__
Out[5]: '0.24.1'

In [6]: new_df = pd.read_csv('s3://experimental/playground/temp_csv/dummy.csv')

In [7]: new_df
Out[7]:
   a  b  c
0  1  1  1
1  2  2  2

प्रकाशन सुचना:

S3 फ़ाइल हैंडलिंग

पांडा अब S3 कनेक्शन को संभालने के लिए s3fs का उपयोग करता है। यह किसी भी कोड को नहीं तोड़ना चाहिए। हालांकि, चूंकि s3fs एक आवश्यक निर्भरता नहीं है, इसलिए आपको इसे अलग से स्थापित करने की आवश्यकता होगी, जैसे पंडों के पूर्व संस्करणों में बोटो। GH11915


मैंने बाल्टी s3 से दो कॉलम के साथ एक सीएसवी पढ़ा, और फाइल सीएसवी की सामग्री मैंने पंडों के डेटाफ्रेम में डाल दी।

उदाहरण:

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()

यदि आप None को None to_csv() के पहले तर्क के रूप में पास None करते हैं, तो डेटा को एक स्ट्रिंग के रूप में वापस कर दिया जाएगा। वहाँ से यह एक आसान कदम है कि एक ही बार में S3 पर अपलोड करें।

StringIO ऑब्जेक्ट को to_csv() पास करना भी संभव होना चाहिए, लेकिन स्ट्रिंग का उपयोग करना आसान होगा।


    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





boto3