我有一个运行在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()
具体来说,这两个问题是:
- 文件被上传到S3,而仍然在
with
上下文管理器中,所以文件可能没有完全写入磁盘 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')
详情请参阅上下文管理器。