AWS Lambda Python 3.8如何写入具有多个列和多行的CSV文件?

2024-06-16 11:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写入一个名为Key='CSV/ccc_master_circuit.CSV'的CSV文件,我在S3中的bucket名称是cenicbucket1。如果client.put_object语句中只有一列,则我能够写入ccc_master_circuit.csv而不会出错

只有当我尝试使用多个列编写时,才会出现下面的错误。我还试图在CSV文件中写入多行内容

以下是Lambda运行错误(在调用之后)

{
  "errorMessage": "Syntax error in module 'lambda_function': invalid syntax (lambda_function.py, line 135)",
  "errorType": "Runtime.UserCodeSyntaxError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\" Line 135\n        client.put_object(Body=ccckeyid prjstatus cenic_status cenic_internal telco cenic_imp_jira order_date deliv_date cpe_date ops_ready mig_complete disco_date usg_track_sw crickusage Project_Value_HiLvl cirid, Bucket='cenicbucket1', Key='csv/ccc_master_circuit.csv')\n"
  ]
}

我的Lambda函数运行的是Python 3.8代码。在for循环中调用def create_csv运行iterable时,我还需要编写多行代码

快速工作流程简介

  1. def main调用def bump_至_master(图纸)
  2. def bump_through_master(sheet)一次读取一行Smartsheet文件并分配变量(用于循环)
  3. bump_through_master(sheet)传递从Smartsheet行收集的变量,并调用def create_csv函数
  4. def create_csv将变量写入名为“cenicbucket1”的S3存储桶中的csv cenic_主电路<这就是我得到Lambda错误的地方
  5. 每次调用def create_csv时,csv文件cenic_master_电路中应追加一行新行
  • Smartsheet就像云上的Excel文件。这里只提到完整性。*
def create_csv(ccckeyid, prjstatus, cenic_status, cenic_internal, telco, cenic_imp_jira, order_date, deliv_date, cpe_date, ops_ready, mig_complete, disco_date, usg_track_sw, crickusage, Project_Value_HiLvl, cirid):
    print("Creating CSV...")
    
    try:
      encoded_ccckeyid = ccckeyid.encode("utf-8")
    except:
      print("encoded_ccckeyid is NonType.  Skipping ...")
      return
      
    encoded_prjstatus = prjstatus.encode("utf-8")
    encoded_cenic_status = cenic_status.encode("utf-8")
    encoded_cenic_internal = cenic_internal.encode("utf-8")
    encoded_telco = telco.encode("utf-8")
    encoded_cenic_imp_jira = cenic_imp_jira.encode("utf-8")
    encoded_order_date = order_date.encode("utf-8")
    encoded_deliv_date = deliv_date.encode("utf-8")
    encoded_cpe_date = cpe_date.encode("utf-8")
    encoded_ops_ready = ops_ready.encode("utf-8")
    encoded_mig_complete = mig_complete.encode("utf-8")
    encoded_disco_date = disco_date.encode("utf-8")
    encoded_usg_track_sw = usg_track_sw.encode("utf-8") 
    encoded_crickusage = crickusage.encode("utf-8") 
    encoded_Project_Value_HiLvl = Project_Value_HiLvl.encode("utf-8")
    encoded_cirid = cirid.encode("utf-8")
        
    #Create CSV file in S3 bucket
    ccckeyid = encoded_ccckeyid
    prjstatus = encoded_prjstatus
    cenic_status = encoded_cenic_status
    cenic_internal = encoded_cenic_internal
    telco = encoded_telco
    cenic_imp_jira = encoded_cenic_imp_jira
    order_date = encoded_order_date
    deliv_date = encoded_deliv_date
    cpe_date = encoded_cpe_date
    ops_ready = encoded_ops_ready
    mig_complete = encoded_mig_complete
    disco_date = encoded_disco_date
    usg_track_sw = encoded_usg_track_sw
    crickusage =  encoded_crickusage
    Project_Value_HiLvl = encoded_Project_Value_HiLvl
    cirid = encoded_cirid
    bucket_name = "cenicbucket1"
    file_name = "ccc_master_circuit.csv"
    lambda_path = "/tmp/" + file_name
    s3_path = "/csv/" + file_name
    client = boto3.client('s3')
    client.put_object(Body=ccckeyid prjstatus cenic_status cenic_internal telco cenic_imp_jira order_date deliv_date cpe_date ops_ready mig_complete disco_date usg_track_sw crickusage Project_Value_HiLvl cirid, Bucket='cenicbucket1', Key='csv/ccc_master_circuit.csv')

def bump_through_master(sheet):
  
  x = 0
  
  for row in sheet.rows:
    x += 1

    #************ CCC Key ID *********
    ccckeyid = row.get_cell("CCC Key ID").value     
    if ccckeyid == "None":
        continue
    print("ccckeyid", ccckeyid)
    
    prjstatus = row.get_cell("CCC Project Status").value
    
    prjstatus = clean_fld(prjstatus)
    if isBlank(prjstatus):
      prjstatus = ""
      
      
    print("Record [", x, "]", " prjstatus", prjstatus)

    #***********  CENIC Status ************
    cenic_status = row.get_cell("CENIC Status Update").value    
    cenic_status = clean_fld(cenic_status)
    if isBlank(cenic_status):
      cenic_status = ""
    
    #***********  CENIC Internal Status ***
    cenic_internal = row.get_cell("CENIC Internal Status").value
    cenic_internal = clean_fld(cenic_internal)
    if isBlank(cenic_internal):
      cenic_internal = ""
         
    telco = row.get_cell("Telco").value
    telco = clean_fld(telco)
    if isBlank(telco):
      telco = ""
          
    cenic_imp_jira = row.get_cell("CENIC Implement Jira #").value        
    cenic_imp_jira = clean_fld(cenic_imp_jira)
    if isBlank(cenic_imp_jira):
      cenic_imp_jira = ""
          
    order_date = row.get_cell("Order Date - Text").value
    order_date = clean_fld(order_date)
    order_date = fix_date(order_date, ccckeyid)
    if isBlank(order_date):
      order_date = ""
          
    deliv_date = row.get_cell("Delivery Date - Text").value
    deliv_date = clean_fld(deliv_date)
    deliv_date = fix_date(deliv_date, ccckeyid)
    if isBlank(deliv_date):
      deliv_date = ""
          
    cpe_date = row.get_cell("CPE Date - Text").value
    cpe_date = clean_fld(cpe_date)
    cpe_date = fix_date(cpe_date, ccckeyid)
    if isBlank(cpe_date):
      cpe_date = ""
          
    ops_ready = row.get_cell("Ops Ready Date - Text").value
    ops_ready = clean_fld(ops_ready)
    ops_ready = fix_date(ops_ready, ccckeyid)
    if isBlank(ops_ready):
      ops_ready = ""
          
    mig_complete = row.get_cell("Migration Complete Date - Text").value
    mig_complete = clean_fld(mig_complete)
    mig_complete = fix_date(mig_complete, ccckeyid)
    if isBlank(mig_complete):
      mig_complete = ""
          
    disco_date = row.get_cell("Disconnect Date - Text").value
    disco_date = clean_fld(disco_date)
    disco_date = fix_date(disco_date, ccckeyid)
    if isBlank(disco_date):
      disco_date = ""
              
    crickusage = row.get_cell("Cricket Usage Report").value    
    crickusage = clean_fld(crickusage)
    if isBlank(crickusage):
      crickusage = ""
              
    usg_track_sw = row.get_cell("Usage Tracking").value    
    usg_track_sw = clean_fld(usg_track_sw)
    if isBlank(usg_track_sw):
      usg_track_sw = ""
              
    cirid = row.get_cell("CIRCUIT ID").value
    cirid = clean_fld(cirid)
    if isBlank(cirid):
      cirid = ""
              
    Project_Value_HiLvl = row.get_cell("Project Value HiLvl").value
    Project_Value_HiLvl = clean_fld(Project_Value_HiLvl)          
    if isBlank(Project_Value_HiLvl):
      Project_Value_HiLvl = ""
              
    debugprints(ccckeyid, prjstatus, cenic_status, cenic_internal, telco, cenic_imp_jira, order_date, deliv_date, cpe_date, ops_ready, mig_complete, disco_date, usg_track_sw, crickusage, Project_Value_HiLvl, cirid)
    create_csv(ccckeyid, prjstatus, cenic_status, cenic_internal, telco, cenic_imp_jira, order_date, deliv_date, cpe_date, ops_ready, mig_complete, disco_date, usg_track_sw, crickusage, Project_Value_HiLvl, cirid)
    
def main():

  smartsheet,SHEET_ID = import_simple_smartsheet_env()

  sheet = smartsheet.sheets.get(SHEET_ID)

  bump_through_master(sheet)

一个额外的问题

有没有办法在我的Lambda/Python代码中删除csv/ccc_master_circuit.csv?我需要在运行函数之前执行此操作,这样我就有了一个“干净”的ccc_master_circuit.csv,其中在每次函数调用开始时都不存在以前写入的数据。在我写入新数据之前,删除CSV文件必须发生在函数的顶部


Tags: csvgetdateorderopsrowcompleteready