import boto3 from datetime import datetime from io import StringIO import pandas as pd class FeedbackSaverWithPandas: def __init__(self, aws_access_key_id, aws_secret_access_key): self.s3_client = boto3.client( 's3', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key ) def save_feedback_to_s3(self, question, response, feedback, bucket_name, object_key): """Append new feedback data to existing CSV in an S3 bucket and save it back.""" current_df = self._read_current_data_from_s3(bucket_name, object_key) new_df = pd.DataFrame([{ "Date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "Question": question, "Response": response, "Feedback": feedback }]) appended_data = pd.concat([current_df, new_df], ignore_index=True) self._write_data_to_s3(appended_data, bucket_name, object_key) def _read_current_data_from_s3(self, bucket, key): """Read existing CSV from S3 bucket into a pandas DataFrame.""" try: csv_obj = self.s3_client.get_object(Bucket=bucket, Key=key) csv_string = csv_obj['Body'].read().decode('utf-8') return pd.read_csv(StringIO(csv_string)) except self.s3_client.exceptions.NoSuchKey: # Return an empty DataFrame if the file does not exist return pd.DataFrame(columns=["Date", "Question", "Response", "Feedback"]) def _write_data_to_s3(self, data_frame, bucket, key): """Write DataFrame back to S3 as a CSV.""" csv_buffer = StringIO() data_frame.to_csv(csv_buffer, index=False) self.s3_client.put_object(Bucket=bucket, Key=key, Body=csv_buffer.getvalue().encode('utf-8'))