![](/img/trans.png)
[英]AWS Lambda: read csv file dimensions from an s3 bucket with Python without using Pandas or CSV package
[英]AWS Lambda and S3 and Pandas - Load CSV into S3, trigger Lambda, load into pandas, put back in bucket?
我對AWS和lambda不熟悉,因此,如果這是一個愚蠢的問題,我深表歉意。 我想做的是將電子表格加載到s3存儲桶中,基於該上傳觸發lambda,讓lambda將csv加載到熊貓中並對其進行處理,然后將數據幀寫回到csv中並放入第二個s3中桶。
我已經閱讀了很多有關壓縮python腳本以及所有庫和依賴項並將其上傳的知識,這就是一個單獨的問題。 我還弄清楚了如何在將文件上傳到S3存儲桶時觸發lambda,以及如何將文件自動復制到第二個S3存儲桶。
我無法找到任何信息的部分是中間部分,將文件加載到pandas中,並在lambda函數內部的所有pandas中操作文件。
第一個問題:那樣的事情可能嗎? 第二個問題:如何從s3存儲桶中“抓取”文件並將其加載到熊貓中? 會是這樣嗎?
import pandas as pd
import boto3
import json
s3 = boto3.resource('s3')
def handler(event, context):
dest_bucket = s3.Bucket('my-destination-bucket')
df = pd.read_csv(event['Records'][0]['s3']['object']['key'])
# stuff to do with dataframe goes here
s3.Object(dest_bucket.name, <code for file key>).copy_from(CopySource = df)
? 我真的不知道那是不是還很接近,並且在黑暗中是完整的鏡頭。 我們將不勝感激任何幫助,因為我顯然不適合我!
此代碼在PUTS上觸發Lambda函數,然后對其進行GETS,然后將其PUTS到另一個存儲桶中:
from __future__ import print_function
import os
import time
import json
import boto3
s3 = boto3.client('s3')
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = quote(event['Records'][0]['s3']['object']['key'].encode('utf8'))
try:
response = s3.get_object(Bucket=bucket, Key=key)
s3_upload_article(response, bucket, end_path)
return response['ContentType']
except Exception as e:
print(e)
print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
raise e
def s3_upload_article(html, bucket, end_path):
s3.put_object(Body=html, Bucket=bucket, Key=end_path, ContentType='text/html', ACL='public-read')
我從編寫的更復雜的Lambda腳本中拆分了此代碼,但是,我希望它顯示您需要做的一些事情。 對象的PUTS僅觸發密碼。 觸發事件后發生的任何其他操作取決於您是否要編寫腳本。
bucket = event['Records'][0]['s3']['bucket']['name']
key = quote(event['Records'][0]['s3']['object']['key'].encode('utf8'))
前幾行中的存儲桶和密鑰是觸發事件的對象的存儲桶和密鑰。 其他一切都取決於您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.