python - AWS S3 पर एक पाठ फ़ाइल को डिस्क पर लिखे बिना पंडों में कैसे आयात करें




pandas heroku (4)

अब पांडा S3 URL को संभाल सकते हैं । आप बस कर सकते हैं:

import pandas as pd
import s3fs

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

यदि आपके पास नहीं है तो आपको s3fs स्थापित करने की आवश्यकता है pip install s3fs

प्रमाणीकरण

यदि आपकी S3 बाल्टी निजी है और प्रमाणीकरण की आवश्यकता है, तो आपके पास दो विकल्प हैं:

1- अपनी ~/.aws/credentials कॉन्फिग फ़ाइल में एक्सेस क्रेडेंशियल्स जोड़ें

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

या

2- निम्नलिखित पर्यावरण चर को उनके उचित मूल्यों के साथ सेट करें:

  • aws_access_key_id
  • aws_secret_access_key
  • aws_session_token

मेरे पास S3 पर एक टेक्स्ट फाइल सेव है जो कि एक टैब सीमांकित तालिका है। मैं इसे पांडा में लोड करना चाहता हूं, लेकिन इसे पहले नहीं बचा सकता क्योंकि मैं एक हरको सर्वर पर चल रहा हूं। यह है, जो कि अभी तक मेरे पास है।

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)

त्रुटि है

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

मैं प्रतिक्रिया निकाय को एक प्रारूप में कैसे परिवर्तित करूँगा जो पांडा स्वीकार करेंगे?

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

अद्यतन - निम्नलिखित कार्य का उपयोग करना

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

तथा

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

एक विकल्प csv को df.to_dict() माध्यम से json में df.to_dict() और फिर इसे एक स्ट्रिंग के रूप में संग्रहीत करना है। ध्यान दें कि यह केवल तभी प्रासंगिक है जब CSV एक आवश्यकता नहीं है, लेकिन आप बस जल्दी से डेटाफ़्रेम को S3 बाल्टी में डालना चाहते हैं और इसे फिर से प्राप्त करना चाहते हैं।

from boto.s3.connection import S3Connection
import pandas as pd
import yaml

conn = S3Connection()
mybucket = conn.get_bucket('mybucketName')
myKey = mybucket.get_key("myKeyName")

myKey.set_contents_from_string(str(df.to_dict()))

यह df को एक तानाशाह स्ट्रिंग में बदल देगा, और फिर इसे S3 में json के रूप में बचाएगा। आप इसे बाद में उसी जॅसन फॉर्मेट में पढ़ सकते हैं:

df = pd.DataFrame(yaml.load(myKey.get_contents_as_string()))

अन्य समाधान भी अच्छे हैं, लेकिन यह थोड़ा सरल है। यमल जरूरी नहीं हो सकता है लेकिन आपको जॉग स्ट्रिंग को पार्स करने के लिए कुछ चाहिए। यदि S3 फ़ाइल को CSV होना आवश्यक नहीं है, तो यह एक त्वरित सुधार हो सकता है।



s3fs साथ इसे s3fs किया जा सकता है:

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)




boto3