2017-07-10 9 views
0

ファイルを複数の小さなファイルに分割しようとしていますが、lamdbaを使用せずに1つのファイルに対してロジックがうまく動作します。ループを完了せずに、ファイルを間違って書き込みます。中/大型ファイルAWSラムダPython分割ファイルを小さなファイルに分割すると、無限ループで実行される

ファイル土地/及びlamdba:これまでのforループの外に一つだけのトリガー

ロジックフローを開始したファイルがあるにもかかわらず、数回実行しようとする私のデバッグに基づき

トリガーおよびロジックに基づいてファイルを分割しようとすると、中/ splitfiles/

ファイル内容の小さなファイルを配置します:

ABC | filename1.DAT | 123

CDE | filename2.DAT | 8910

XYZ | filename3.DAT | 456

FGH | filename4.DAT | 4545

O/P

はFile1:

ABC | filename1.DAT | 123

CDE | filename2.dat | 8910

ファイル2:

XYZ | filename3.DAT | 456

FGH | filename4.DAT | 4545

コード:

import boto3 
import os 
s3client = boto3.client('s3') 
s3 = boto3.resource('s3') 
def lambda_handler(event, context): 
    try: 
     for record in event['Records']: 
      bucket = record['s3']['bucket']['name'] 
      key = record['s3']['object']['key'] 
      print(key) 
      obj = s3.Object(bucket, key) 
      linesplit = obj.get()['Body'].read().split('\n') 
      lines_per_file=2 #number of lines per file 
      created_files = 0 
      sfilelines='' 
      for rownum,line in enumerate(linesplit,start=1): 
       sfilelines = sfilelines + '\n' + line 
       if rownum%lines_per_file == 0: 
       cnt = lines_per_file * (created_files + 1) 
       body_contents = str(sfilelines) 
       file_name = "%s_%s.DAT" % ('Testfile', cnt) 
       target_file = "splitfiles/" + file_name 
       print(target_file) 
       s3client.put_object(ACL='public-read', ServerSideEncryption='AES256', Bucket=bucket, Key=target_file, 
          Body=body_contents) 
       sfilelines = '' # Reset variables 
       created_files += 1 # One more small file has been created 
      if rownum: # to get the pending lines that is not written 
       cnt = lines_per_file * (created_files + 1) 
       body_contents = str(sfilelines) 
       file_name = "%s_%s.DAT" % ('Testfile', cnt) 
       target_file = "splitfiles/" + file_name 
       print(target_file) 
       s3client.put_object(ACL='public-read', ServerSideEncryption='AES256', Bucket=bucket, Key=target_file, 
          Body=body_contents) 
       created_files += 1 
     print ('%s split files (with <= %s lines each) were created.' % (created_files,lines_per_file)) 

    except Exception as e: 
     print e 
+1

同じファイルの各呼び出しで 'context'の内容を共有できますか?ラムダトリガーをどのように定義したかによって、1つのファイルにつき複数のラムダ起動、つまり異なるS3オブジェクトライフサイクルイベントが発生している可能性があります。 –

+0

入力していただきありがとうございます。トリガーを修正しても問題ありません。 – Rajeev

+0

これを正解にして受け入れることができます! –

答えて

1

あなたはラムダ・トリガーを定義した方法に応じて、ファイルごとに複数のラムダ起動、つまり異なるS3オブジェクトライフサイクルイベントが発生している可能性があります。

関連する問題