使用AWS lambda创建变量为列的CSV



我创建了一个lambda,它扫描我的s3存储桶,并为s3中找到的每个对象收集一些元数据。然而,当我用s3对象的数据导出CSV时,遇到了一个障碍。我的CSV只返回一条记录,如何让我的CSV返回所有对象?

请参阅下面的Lambda代码:

import re 
import datetime
from datetime import date
import os
import math
import csv 

s3 = boto3.client('s3')
logger = logging.getLogger()
logger.setLevel(logging.INFO)
time=date.today().strftime("%d/%m/%Y")

def lambda_handler(event, context):
s3_resource = boto3.resource('s3')
result = []
bucket = s3_resource.Bucket('dev-bucket')
key='csv_file.csv'

for object in bucket.objects.all():
name=object.key
size=object.size
si=list(name)
dates=object.last_modified.strftime("%d/%m/%Y")
owner=object.owner['DisplayName']
days_since_creation= datetime.datetime.strptime(time, "%d/%m/%Y") - datetime.datetime.strptime(dates, "%d/%m/%Y")
days_since_creation=days_since_creation.days
to_delete =[]



if days_since_creation >= 30: 
to_delete = 'Y'
else:
to_delete = 'N' 



myfile = open("/tmp/csv_file.csv", "w+")
writer = csv.writer(myfile,delimiter='|')
rows = name, size, dates, days_since_creation
rows=list(rows)
writer.writerow(rows)
myfile.close()
#upload the data into s3
s3.upload_file('/tmp/csv_file.csv', 'dev-bucket', 'cleanuptest.csv')

print(rows)

我的当前输出如下:

09ff0687-a644-4d5e-9de8-277594b194a6.csv.metadata|280|29/11/2021|78

首选输出为:

0944ee8b-1e17-496a-9196-0caed1e1de11.csv.metadata|152|08/12/2021|69
0954d7e5-dcc6-4cb6-8c07-70cbf37a73ef.csv|8776432|16/11/2021|91
0954d7e5-dcc6-4cb6-8c07-70cbf37a73ef.csv.metadata|336|16/11/2021|91
0959edc4-fa02-493f-9c05-9040964f4756.csv|6338|29/11/2021|78
0959edc4-fa02-493f-9c05-9040964f4756.csv.metadata|225|29/11/2021|78
0965cf32-fc31-4acc-9c32-a983d8ea720d.txt|844|10/12/2021|67
0965cf32-fc31-4acc-9c32-a983d8ea720d.txt.metadata|312|10/12/2021|67
096ed35c-e2a7-4ec4-8dae-f87b42bfe97c.csv|1761|09/12/2021|68

不幸的是,我做不好,我不确定我做错了什么。将不胜感激

我认为在您当前的设置中,您可以打开和关闭每一行的文件。所以,基本上,在文件的末尾会有最后一行。

你可能想要的是:

myfile = open("/tmp/csv_file.csv", "w+")
for object in bucket.objects.all():
<the looping logic>
myfile.close()
s3.upload_file('/tmp/csv_file.csv', 'dev-bucket', 'cleanuptest.csv')

你可以证明打开&每次关闭文件都会通过运行以下最低版本的脚本来重写文件:

import csv
myfile1 = open("csv_file.csv", "w+")
writer1 = csv.writer(myfile1,delimiter='|')
row1 = "a", "b", "c"
rows1 = list(row1)
writer1.writerow(rows1)
myfile1.close()
print(rows1)
myfile2 = open("csv_file.csv", "w+")
writer2 = csv.writer(myfile2,delimiter='|')
row2 = "x", "y", "z"
rows2 = list(row2)
writer2.writerow(rows2)
myfile2.close()
print(rows2)

文件输出:

x|y|z

FYI您也可以使用a以附加模式打开文件,以确保不会覆盖行。

myfile = open("/tmp/csv_file.csv", "a")

使用w有以下文档中提到的警告:

'w'仅用于写入(具有相同名称的现有文件将被擦除(

"a"打开文件进行追加;写入文件的任何数据都会自动添加到末尾。

最新更新