AWS Lambda Python 读取所有行,但不会写入所有行



我有一个运行在AWS Lambda中的Python 3.8脚本。

应该用csv从S3逐行读取文件。reader(data_in, delimiter=',')并逐行写入同一桶中的另一个CSV文件

显然它工作得很好,但是当我查看输出文件时,它总是有更少的行。

脚本如下:

import json
import os
import io
import boto3
import csv
import time
def lambda_handler(event, context):
s3 = boto3.resource(u's3')
s3_object_in = s3.Object('MYBUCKET', 'INPUT.csv')
data_in = s3_object_in.get()['Body'].read().decode('utf-8').splitlines()
lines = csv.reader(data_in, delimiter=',')
lambda_path = "/tmp/temp.csv"
with open(lambda_path, 'w+', encoding="utf-8") as file:
i_in=0
for line in lines:
file.write(str(i_in)+ 'n')
i_in += 1
s3.Bucket('MYBUCKET').upload_file(lambda_path, 'out.csv')
file.close()

s3_object_out = s3.Object('MYBUCKET', 'out.csv')
data_out = s3_object_out.get()['Body'].read().decode('utf-8').splitlines()    
lines_out = csv.reader(data_out)
i_out=0
for line in lines_out:
i_out += 1
return {
'count_in': i_in,
'count_out': i_out
}

此代码在测试时返回以下响应:

<<p>反应/strong>
{
"count_in": 25428,
"count_out": 25057
}

因此,通过查看i_in,代码显然一直运行到输入文件的最后一行(实际上有25428行)。但是文件。写函数在第25057行停止。

输出文件写入一个连续计数器,从0开始,到25056结束

任何想法?

我正在运行1024 MB内存,10分钟超时

以下代码有两个问题:

with open(lambda_path, 'w+', encoding="utf-8") as file:
i_in=0
for line in lines:
file.write(str(i_in)+ 'n')
i_in += 1
s3.Bucket('MYBUCKET').upload_file(lambda_path, 'out.csv')
file.close()

具体来说,这两个问题是:

  1. 文件被上传到S3,而仍然在with上下文管理器中,所以文件可能没有完全写入磁盘
  2. with上下文管理器将自动关闭文件,因此不需要file.close()

代码应该这样写:

with open(lambda_path, 'w+', encoding="utf-8") as file:
i_in=0
for line in lines:
file.write(str(i_in)+ 'n')
i_in += 1
s3.Bucket('MYBUCKET').upload_file(lambda_path, 'out.csv')

详情请参阅上下文管理器。

最新更新