AWS S3 তে কোনও পাঠ্য ফাইল কীভাবে ডিস্কে না লিখে প্যান্ডাসে আমদানি করবেন


91

আমার কাছে S3 এ একটি পাঠ্য ফাইল সংরক্ষণ করা আছে যা একটি ট্যাব সীমিত টেবিল। আমি এটিকে পান্ডায় লোড করতে চাই তবে প্রথমে এটি সংরক্ষণ করতে পারি না কারণ আমি হিরকু সার্ভারে চলছে running আমার এখন পর্যন্ত যা আছে তা এখানে।

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)

এই ভাবে চেষ্টা করে দেখুন: io.BytesIO(file)অথবা io.StringIO(file)পরিবর্তে fileমধ্যে read_csv()কল
MaxU

আপনি এই উত্তরio.StringIO হিসাবে ব্যবহার করতে পারেন ।
ইয়ানস

এই প্রস্তাবগুলির কোনওটিরই কাজ হয়নি। আপনি আমার পোস্ট সম্পাদনা ত্রুটি দেখতে পারেন।
alpalalpal

4
আপডেট অংশটি আমার পক্ষে কাজ করেছিল। ধন্যবাদ
উইম বার্চম্যানস

উত্তর:


110

pandasএর botoজন্য ব্যবহার করে read_csv, যাতে আপনার সক্ষম হওয়া উচিত:

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

আপনার যদি প্রয়োজন হয় boto3কারণ আপনি চালু আছেন তবে python3.4+আপনি পারেন

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

যেহেতু সংস্করণ 0.20.1 pandas ব্যবহার করে s3fs, নীচে উত্তর দেখুন।


ইউআরএল সবার কাছে প্রকাশ্য না করে ব্যবহার করার কোনও উপায় আছে কি? ফাইলটি ব্যক্তিগত থাকতে হবে।
alpalalpal

boto3: ডক্স কিভাবে কনফিগার প্রমাণীকরণের সাথে যাতে আপনি ব্যক্তিগত ফাইল পাশাপাশি অ্যাক্সেস করতে পারেন দেন boto3.readthedocs.io/en/latest/guide/quickstart.html
স্টিফান

4
এটি NoCredentialsError নিক্ষেপ করছে। আমি কীভাবে এটি s3 শংসাপত্র সেট করব? আমি অজগর এবং বোটোতে নতুন
সুনীল রাও

15
আমি দেখতে পেলাম যে boto3 দিয়ে শেষ উদাহরণটিতে আমার নিম্নলিখিত কাজগুলি করতে হয়েছিল: df = pd.read_csv(io.BytesIO(obj['Body'].read()), encoding='utf8')
ব্যবহারকারী 39444430

এই উত্তরটি পুরানোওয়েসমস উত্তর দেখুন দয়া করে ।
জন্মানো

80

এখন পান্ডারা এস 3 ইউআরএল পরিচালনা করতে পারে । আপনি সহজভাবে করতে পারেন:

import pandas as pd
import s3fs

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

আপনারs3fs যদি এটি না থাকে তবে আপনাকে ইনস্টল করতে হবে। pip install s3fs

প্রমাণীকরণ

যদি আপনার এস 3 বালতিটি ব্যক্তিগত হয় এবং প্রমাণীকরণের প্রয়োজন হয়, আপনার কাছে দুটি বিকল্প রয়েছে:

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

সুন্দর। পাইথন 3 এ কাজ করে।
কিলার ব্রাউন

কিভাবে প্রমাণীকরণ সম্পর্কে ..?
জেমস ওয়েয়ারজবা

4
@ জেমস ওয়েয়ারজবা, আমি আমার উত্তরটিতে প্রমাণীকরণের বিষয়ে আরও বিশদ যুক্ত করেছি।
ওয়েসম

4
একাধিক আওস প্রোফাইলগুলির সাথে কাজ করার সময়, আপনি কোন প্রোফাইলটি ব্যবহার করা উচিত তা কীভাবে নির্বাচন করতে পারেন? s3fs এর প্রোফাইল_নাম বিকল্প রয়েছে তবে আমি নিশ্চিত নই যে এটি কীভাবে পান্ডাসের সাথে কাজ করে।
আইভো মার্চিয়ার্স

4
@ আইএনএস সত্যই নয়, বর্তমানে আমি প্রথমে এস3fs (নির্দিষ্ট প্রোফাইলটি ব্যবহার করে) ফাইলটি খুলি এবং তারপরে আমি পান্ডাস
আইভো মার্চিয়ার্স

15

এটি এখন সর্বশেষ প্যান্ডাসে সমর্থিত। দেখা

http://pandas.pydata.org/pandas-docs/stable/io.html#reading-remote-files

যেমন।,

df = pd.read_csv('s3://pandas-test/tips.csv')

4
মনে রাখবেন যে 'এস 3 ইউআরএলগুলিও হ্যান্ডল করা হয় তবে এস 3 এফ লাইব্রেরি ইনস্টল করা প্রয়োজন'
জুলিও ভিলেন

প্রমাণীকরণ সম্পর্কে কী
জেমস ওয়েয়ারজবা

লেখক সহ ইউআরএল কঠিন হতে পারে যদি না, ইউআরএল জনসমক্ষে প্রকাশিত হয়, সাধারণ / বেসিক
এইচপি লেখক

9

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)

4
আমি মনে করি s3fs দিয়ে আপনি এমনকি লিখতেও পারেনdf = pd.read_csv('s3://mybucket/path/to/object/foo.pkl')
louis_guitton

4
@ লুইস_গুইটন এটি পিডি-রিড_সিএসভিতে কাজ করছে বলে মনে হচ্ছে তবে পঠন-পিকেলের সাথে নয়
সিপ

1

যেহেতু ফাইলগুলি খুব বড় হতে পারে, তাই এগুলি সম্পূর্ণ ডেটাফ্রেমে লোড করা বুদ্ধিমানের কাজ নয়। সুতরাং, লাইন দ্বারা লাইন পড়ুন এবং এটি ডেটা ফ্রেমে সংরক্ষণ করুন। হ্যাঁ, আমরা রিড_সিএসভিতে খণ্ড আকার সরবরাহ করতে পারি তবে তারপরে আমাদের পঠিত সারিগুলির সংখ্যা বজায় রাখতে হবে।

অতএব, আমি এই ইঞ্জিনিয়ারিং নিয়ে এসেছি:

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=",")

কাজটি শেষ হয়ে গেলে আমি df মুছুন। del df


1

পাঠ্য ফাইলগুলির জন্য, আপনি পাইপ-বিস্মৃত ফাইল সহ নীচের কোডটি ব্যবহার করতে পারেন উদাহরণস্বরূপ: -

import pandas as pd
import io
import boto3
s3_client = boto3.client('s3', use_ssl=False)
bucket = #
prefix = #
obj = s3_client.get_object(Bucket=bucket, Key=prefix+ filename)
df = pd.read_fwf((io.BytesIO(obj['Body'].read())) , encoding= 'unicode_escape', delimiter='|', error_bad_lines=False,header=None, dtype=str)

0

একটি বিকল্প হ'ল সিএসভিকে জোসনের মাধ্যমে রূপান্তর করা df.to_dict()এবং তারপরে স্ট্রিং হিসাবে সংরক্ষণ করা। দ্রষ্টব্য এটি কেবলমাত্র প্রাসঙ্গিক যদি সিএসভি কোনও প্রয়োজন না হয় তবে আপনি কেবল এস3 বালতিতে ডেটা ফ্রেমটি দ্রুত রেখে আবার এটি পুনরুদ্ধার করতে চান।

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

এটি ডিএফকে ডিক স্ট্রিংয়ে রূপান্তরিত করবে এবং তারপরে এটি এস 3-তে জসন হিসাবে সংরক্ষণ করবে। আপনি পরে এটি একই জসন ফর্ম্যাটে পড়তে পারেন:

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

অন্যান্য সমাধানগুলিও ভাল তবে এটি কিছুটা সহজ। ইয়ামল অগত্যা প্রয়োজন হতে পারে না তবে জসন স্ট্রিংটি পার্স করার জন্য আপনার কিছু দরকার। যদি এস 3 ফাইলের অগত্যা কোনও সিএসভি হওয়ার প্রয়োজন হয় না তবে এটি দ্রুত সমাধান হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.