【问题标题】:Convert json to csv from one S3 bucket and upload to another S3 bucket through AWS Lambda从一个 S3 存储桶将 json 转换为 csv 并通过 AWS Lambda 上传到另一个 S3 存储桶
【发布时间】:2020-04-09 10:46:48
【问题描述】:

我尝试了以下代码,但无法将数据从 json 转换为 csv。有人可以帮我吗?

import boto3
import botocore
import csv
def lambda_handler(event, context):
    BUCKET_NAME = 'name of the bucket' # replace with your bucket name
    KEY = 'OUTPUT.csv' # replace with your object key
    json_data = [{"id":"1","name":"test"},{"id":"2","name":"good"}]
    with open("data.csv", "w") as file:
        csv_file = csv.writer(file)
        csv_file.writerow(['id', 'name'])
        for item in data:
            csv_file.writerow([item.get('id'),item.get('name')])

    csv_binary = open('data.csv', 'rb').read()
    try:
        obj = s3.Object(BUCKET_NAME, KEY)
        obj.put(Body=csv_binary)
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == "404":
            print("The object does not exist.")
        else:
            raise
    s3client = boto3.client('s3')
    try:
        download_url = s3client.generate_presigned_url(
                         'get_object',
                          Params={
                              'Bucket': BUCKET_NAME,
                              'Key': KEY
                              },
                          ExpiresIn=3600
        )
        return {"csv_link": download_url}
    except Exception as e:
        raise utils_exception.ErrorResponse(400, e, Log)

这是我对上述代码得到的响应:

{
  "errorMessage": "[Errno 30] Read-only file system: 'data.csv'",
  "errorType": "OSError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 8, in lambda_handler\n    with open(\"data.csv\", \"wb\") as file:\n"
  ]
}

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda python-3.7 json2csv


    【解决方案1】:

    在 AWS Lambda 中,您只能在 /tmp/ 目录中创建文件。因此,使用:

    with open("/tmp/data.csv", "w") as file:
    

    最多提供 512MB,因此最好删除任何临时文件,以免它们干扰 Lambda 函数的未来执行。

    【讨论】:

    • 只是为了确认:这是如何删除临时文件对吗?还是有其他方法? os.remove('/tmp/data.csv')
    • 是的,os.remove() 很好。或者,如果您总是创建具有相同名称的本地文件,则可以在下次执行时简单地覆盖它。
    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2020-09-15
    • 2018-06-02
    • 2021-08-15
    • 2020-12-27
    • 2020-02-15
    • 2017-04-14
    相关资源
    最近更新 更多