【问题标题】:How do I create a CSV in Lambda using Python?如何使用 Python 在 Lambda 中创建 CSV?
【发布时间】:2019-12-17 03:27:21
【问题描述】:

我想使用 Python 在 Lambda 中创建一个保存在 CSV 文件中的报告。所以你会找到函数的代码:

import boto3
import datetime
import re

def lambda_handler(event, context):

    client = boto3.client('ce')

    now = datetime.datetime.utcnow()
    end = datetime.datetime(year=now.year, month=now.month, day=1)

    start = end - datetime.timedelta(days=1)
    start = datetime.datetime(year=start.year, month=start.month, day=1)

    start = start.strftime('%Y-%m-%d')
    end = end.strftime('%Y-%m-%d')


    response = client.get_cost_and_usage(
        TimePeriod={
            'Start': "2019-02-01",
            'End':  "2019-08-01"
        },
        Granularity='MONTHLY',
        Metrics=['BlendedCost'],
        GroupBy=[
            {
                'Type': 'TAG',
                'Key': 'Project'
            },
        ]
    )

如何从中创建 CSV 文件?

【问题讨论】:

  • 你在哪里尝试在上面的代码中创建 CSV?试一试,如果遇到困难,请告诉我们。
  • 这就是重点,我理论上知道我想做什么以及如何做,但我不知道如何在代码中实现它。所以我的目标是创建一个 CSV 文件,其中包含 3 列:1. 帐户名称 2. 月份 3. 成本。我的问题是我不知道如何将我得到的信息打包成 CSV 代码

标签: python amazon-web-services amazon-s3 aws-lambda aws-sdk


【解决方案1】:

Repakula Srushith 的上述回答是正确的,但由于文件未关闭,因此将创建一个空的 csv。您可以将代码更改为

f = open("/tmp/csv_file.csv", "w+")
temp_csv_file = csv.writer(f) 
temp_csv_file.writerow(["Account Name", "Month", "Cost"])

# writing rows in to the CSV file
for detail in response:
    temp_csv_file.writerow([detail['account_name'],
                            detail['month'],
                            detail['cost']
                            ])
f.close()

【讨论】:

    【解决方案2】:

    这是一个使用 Python 在 Lambda 中创建 CSV 文件的示例函数:

    假设变量“response”具有为您创建报告所需的数据,以下代码将帮助您在 lambda 函数的/tmp 文件夹中创建一个临时 CSV 文件:

    import csv
    temp_csv_file = csv.writer(open("/tmp/csv_file.csv", "w+"))
    # writing the column names
    temp_csv_file.writerow(["Account Name", "Month", "Cost"])
    
    # writing rows in to the CSV file
    for detail in response:
        temp_csv_file.writerow([detail['account_name'],
                                detail['month'],
                                detail['cost']
                                ])
    

    创建 CSV 文件后,您可以将其上传 S3 并将其作为电子邮件发送或使用以下代码作为链接共享:

    client = boto3.client('s3')
    client.upload_file('/tmp/csv_file.csv', BUCKET_NAME,'final_report.csv')
    

    要记住的要点:

    1. /tmp 是一个大小为 512 MB 的目录存储,可用于在内存/临时文件中存储一些文件
    2. 您不应依赖此存储来跨后续 lambda 函数维护状态。

    【讨论】:

    • 我试图嵌入代码,但不幸得到以下错误:“errorMessage”:“name 'participant_details' is not defined”
    • 糟糕,抱歉。我现在已经更新了代码,只是变量名错误。但是,请务必根据响应变量中数据结构的方式更改temp_csv_file.writerow() function中添加数据的方式
    • 感谢您的帮助!现在终于可以工作了。那么CSV是空的,没有任何行,但那是另一个话题:D
    • 上传的这个文件是空的,大小为0B,由@mango5k 突出显示
    • 文件在上传到 S3 存储桶之前需要关闭。 file= open("/tmp/csv_file.csv", "w+") ... file.close()
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    相关资源
    最近更新 更多