amazon-web-services - 从一个 S3 存储桶将 json 转换为 csv 并通过 AWS Lambda 上传到另一个 S3 存储桶
问题描述
我试过下面的代码,但我无法将数据从 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"
]
}
解决方案
在 AWS Lambda 中,您只能在/tmp/
目录中创建文件。因此,使用:
with open("/tmp/data.csv", "w") as file:
最多提供 512MB,因此最好删除任何临时文件,以免它们干扰 Lambda 函数的未来执行。
推荐阅读
- javascript - 页面加载错误上的 Flask 发布请求
- julia - 在 DiffEqPhysics Julia 中进行一些收敛测试后终止 ode 的集成
- php - 如何从 PHP 中的 MySQL 数据库中检索大小有限的记录集?
- lua - 在love2d中产生更多对象?
- django - 姜戈:为什么是自我。用在这里?
- ruby-on-rails - Rails 5 after_create 回调创建 has_many :通过连接表
- file-upload - 如何绕过渐进式 Web 应用程序中的存储配额限制
- firebase - 在 Firestore 中合并来自不同标签的帖子
- javascript - 破坏 Chrome 缓存以进行浏览器同步重新加载
- android - 如果 USAGE_SHARED,Renderscript 在启用 GPU 的驱动程序上失败