2017-10-02 14 views
0

私は、DB呼び出しを解析してレポートを作成するスクリプトを用意しています。今週末に新しい会計年度が始まるまでは、すばらしい成果を上げています。それがなぜここにあるのかは分かりませんが、それはありません。 Pythonの3.6を使用してPython KeyErrorデータベース結果の解析

データ形式wk = (('Chittendon', '18028656387', 1),)

ここでの唯一の変化はあるため、新しい会計年度のyr変数が空白であってもよいことである今破壊され

コード:

data = {(name, n): [y, 0, 0] for name, n, y in yr} 
for name, n, w in wk: 
    data[name, n][2] = w 

トレースバック:

Traceback (most recent call last): 
    File "C:/Users/Ace/Desktop/IPNV/KP_App/FML/mail_service/vcc_resource.py", line 172, in <module> 
    pooh = Main() 
    File "C:/Users/Ace/Desktop/IPNV/KP_App/FML/mail_service/vcc_resource.py", line 144, in Main 
    data[name, n][2] = w 
KeyError: ('Chittendon', '18028656387') 

私はこれが今日まで完全に動作していると言いました。何が変わったのか分かりません。

+0

データはどのように見えますか?マルチインデックスですか? –

+0

これは 'wk'変数にどのように現れますか?私は質問 – Joe

+0

に投稿しました。wkはdictではありません。それはタプルです。値ではなく、適切なインデックスを使用して値にアクセスできます。 –

答えて

0

yrが空白の場合、data変数は空の辞書{}になります。明らかにキーが存在しないため、アクセスしようとするとキーエラーが発生します。

>>> yr = [] 
>>> data = {(name, n): [y, 0, 0] for name, n, y in yr} 
>>> data 
{} 

デフォルト値を指定する必要があります。

これを処理する1つの方法はget()ではなく、キーエラーのデフォルトの可能性を提供していますので、data.get()ではなく、ダイレクトキーのルックアップを使用することです:

d.get(('Chittendon', '18028656386'), "somedefault") 

EDIT:

が再び探し(たぶん後あなたが存在していてもいなくてもよいキーに基づいてデータに新しい値を割り当てるように見えます。存在しないキーに割り当てようとしているため、エラーは発生していません。これは問題ありませんが、最初にキーのインデックス2にアクセスしようとしています。これにより、キーが存在しない場合にエラーが発生します。あなたは例のためにこれを行うことができます:

data[name, n] = [1, 2, 3] 

[name, n]data

が一緒にこれを置くの既存のキーがない場合でも、あなたはあなたが適切に行動できるようになるtry/catchブロックでこれをラップすることができますどちらの場合も:

for name, n, w in wk:  
    try: 
     data[name, n][2] = w 
    except KeyError: 
     data[name, n] = ['some default', 'another default', w] 
+1

私はあなたを投票しなかった、私はあなたの答えが正しいと思う。私はそれを実装する方法を理解しようとしている。 – Joe

+0

ありがとう@Joe - 人々が投票の際に少し役に立ったら確かにいいだろう。 –

+0

データ変数の一部である理解は、ここの誰かから借りたものです。私の頭を少し上回っているので、私はこれを理解できないと思うのです。デフォルトの設定は、 – Joe

関連する問題