我有一個在 AWS Lambda 中運行的 Python 3.8 腳本。
它應該使用 csv.reader(data_in, delimiter=',') 從 S3 逐行讀取檔案,并逐行寫入同一存盤桶中的另一個 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
}
此代碼在測驗時回傳以下回應:
回復
{
"count_in": 25428,
"count_out": 25057
}
因此,通過查看 i_in,代碼顯然會一直運行到輸入檔案的最后一行(實際上有 25428 行)。但是 file.write 函式在第 25057 行停止。
輸出檔案使用從 0 開始到 25056 結束的連續計數器寫入
有任何想法嗎?
我正在運行 1024 MB RAM,超時 10 分鐘
uj5u.com熱心網友回復:
下面的代碼有兩個問題:
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()
具體來說,兩個問題是:
- 該檔案仍在
with背景關系管理器中時正在上傳到 S3 ,因此該檔案可能未完全寫入磁盤 - 該
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')
有關更多詳細資訊,請參閱背景關系管理器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/331700.html
標籤:Python 亚马逊网络服务 文件 aws-lambda 写
