Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Lambda和Python读取和覆盖AWS s3中的文件?_Python_Amazon Web Services_Amazon S3_Aws Lambda - Fatal编程技术网

如何使用Lambda和Python读取和覆盖AWS s3中的文件?

如何使用Lambda和Python读取和覆盖AWS s3中的文件?,python,amazon-web-services,amazon-s3,aws-lambda,Python,Amazon Web Services,Amazon S3,Aws Lambda,我正在尝试以下方法。但是,当我对lambda调用的文件进行过度编译时,由于这个原因,它将进入一个循环。你能帮帮我吗。下面还粘贴了我用于lambda的代码片段 任务 当文件上载到此文件夹时,读取名为“文件夹a”的文件夹中的文件 然后替换字符大于10的particualr列 然后将此文件上载回同一文件夹,但不幸的是,由于lambda invoke,它处于循环中 尝试移动到另一个名为TrimmedFile的文件夹,然后它工作正常,没有任何循环。 有人能告诉我如何在调用的同一文件夹中读取、编辑和保存文件

我正在尝试以下方法。但是,当我对lambda调用的文件进行过度编译时,由于这个原因,它将进入一个循环。你能帮帮我吗。下面还粘贴了我用于lambda的代码片段

任务

当文件上载到此文件夹时,读取名为“文件夹a”的文件夹中的文件 然后替换字符大于10的particualr列 然后将此文件上载回同一文件夹,但不幸的是,由于lambda invoke,它处于循环中 尝试移动到另一个名为TrimmedFile的文件夹,然后它工作正常,没有任何循环。 有人能告诉我如何在调用的同一文件夹中读取、编辑和保存文件吗


这是为了演示如何读取文件并在编辑后替换它。它可以充当骨架代码

import boto3
import base64
import json
import io


client = boto3.client('s3')
res = boto3.resource('s3')

def lambda_handler(event, context):

    file_key = event['file_key']
    file_obj = s3_res.Object("bucket_name", file_key)

    content_obj = file_obj.get()['Body'].read().decode('utf-8') # fetching the data in

    res.Object("bucket_name", file_key).delete() # Here you are deleting the old file

    ######Performing your operation and saving in new_data variable#########

    new_file = io.BytesIO(new_data.encode())

    client.upload_fileobj(new_file, "bucket_name", file_key) # uploading the file at the exact same location.

我相信您已经在S3上创建了一个事件触发器,并将其与Lambda关联,当您替换文件时,会触发Lambda,它将成为一个循环

有两种方法可以处理它:

1.配置适合您情况的PUT或POST事件类型以触发lambda。现在将更新后的文件保存到另一个位置,然后将其复制到原始位置。执行此操作s3将生成一个s3:ObjectCreated:Copy事件,该事件将不会再次调用Lambda

 # Copying file from secondary location to original location
 copy_sr = {
        "Bucket":bucket,
        "Key"   :file_key_copy
        
    }
    
    s3_resource.meta.client.copy(copy_sr, 
    final_bucket,file_key_copy
    )
    
    #Deleting the file from the secondary location
    s3_client.delete_object(Bucket=bucket,
    Key=file_key_copy
    ) 

2.使用SQS队列并将其配置为在指定的时间段内不处理两次收到的任何消息,具体取决于文件更新的频率

最后一行表示在同一位置上载。它不会再次调用lamda并进行无限循环吗。@Jeeva在骨架代码中,我正在做的是,我从事件接收密钥输入,然后我使用该密钥从S3读取文件,在读取文件并将其存储在content_obj中后,我将删除该文件,之后,一旦对content_obj执行了某个操作,并将其存储在另一个名为new_file的变量中,将该数据转换为字节,然后将其上载到S3中完全相同的位置。尝试了您的骨架代码后,它仍在运行loop@Jeeva问题似乎出在文件的更新部分。第一个选项真的很酷。成功了。谢谢
 # Copying file from secondary location to original location
 copy_sr = {
        "Bucket":bucket,
        "Key"   :file_key_copy
        
    }
    
    s3_resource.meta.client.copy(copy_sr, 
    final_bucket,file_key_copy
    )
    
    #Deleting the file from the secondary location
    s3_client.delete_object(Bucket=bucket,
    Key=file_key_copy
    )