2017-06-05 110 views
0

我的代碼基本上只是通過檢查DictReader的每一行(一個字典列表)並將重複項放入RejectedEvents列表中並返回結果,即一個去重複詞典的詞典。我還需要爲RejectedEvents的每一行添加一個原因,因爲稍後我會拒絕其他原因。代碼與問題一樣是非常明顯的,但不是解決方案;問題是標有#PROBLEM的行,並且當我取出更新語句時問題消失;與更新語句,空值分配,沒有它分配行,所以更新搞砸了。Python:如何添加DictReader行作爲字典以更新列表

def GetScrubbedEventData(MetricID, EventsRaw, RejectEvents): 
    start = time.time() 
    pass_count = 0 
    fail_count = 0 

    result = {} 
    for row in csv.DictReader(EventsRaw, delimiter=","): 
     try: 
      #check duplicate 
      result[row['AssetID']] 
      Reason = {"RejectedFor": "Duplicate AssetID in same file."} 
      RejectEvents.append(dict(row).update(Reason)) #PROBLEM 
      fail_count += 1 
     except KeyError: 
      row['EventStart'] = scrub.Date(row['EventStart']) 
      row['EventEnd'] = scrub.Date(row['EventEnd']) 
      result[row['AssetID']] = row 
      pass_count += 1 

回答

1

更新的行,然後添加更新的行,而不是.update返回值是None

for row in csv.DictReader(EventsRaw): 
    ... 
    row.update(Reason) 
    RejectEvents.append(row) 

或者你可以設置一個新的直接在字典row,而無需創建單-valued字典Reason

for row in csv.DictReader(EventsRaw): 
    ... 
    row["RejectedFor"] = "Duplicate AssetID in same file." 
    RejectEvents.append(row) 
+0

哇,謝謝......我可以發誓我試過了,以爲它失敗了,因爲我是從更新的行DictRead,而不是一個字典...經過測試,第一個解決方案失敗時,我使用的字典(行).update(原因)....但拿出字典(),它的工作原理...謝謝。 – gunslingor

+0

'dict'調用不起作用,因爲它更新了一個新的未引用dict而不是'row'。 –

相關問題