2017-06-05 23 views
0

私のコードは基本的にはDictReader(dictsのリスト)の各行をチェックし、dictsのRejectedEventsリストに入れて結果を返します。 dictsのdeduplicated dictです。私は後でRejectedEventsの各行に理由を追加する必要があります。なぜなら、後で他の理由でも却下するからです。このコードは、問題のようにかなり自明ですが、解決策ではありません。問題は#PROBLEMとマークされた行であり、更新ステートメントを取り出すと問題は消えます。更新ステートメントでは、nullが割り当てられ、行が割り当てられていないと、更新がそれを混乱させます。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

更新した行とは、更新された行、ないNoneある.updateの戻り値を追加します。

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

それとも、直接のdict row上の単一を作成しなくても、新しいを設定することができます-valued辞書Reason

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

うわー、おかげで...私はそれを試してみました宣誓、私はから行を更新しましたので、それが失敗したと思ったかもしれませんDictReadではなくdict ...テスト後、最初の解決策は、dict(行).update(Reason)を使用していたときに失敗します...しかし、dict()を取り出すと動作します...ありがとう。 – gunslingor

+0

'dict'呼び出しは、' row'の代わりに新しい参照されていないdictを更新するので動作しません。 –

関連する問題