2017-04-04 6 views
0

いくつかのGETリクエストを処理するためにループを実行できるpythonスクリプトを作成しました。次に、「クリエイティブ」フィールドの各リクエストの値を取得し、スクリプトの最後に「True」と「False」の両方の値の最終カウントを出力します。ここに私のコードは次のようになります。ここではGETリクエストループを実行するPythonスクリプトでは、「KeyError」がスローされますが、毎回ではありません。

import requests 
import json 


false_count = 0 
true_count = 0 

qa_creatives = open("numbers.txt") 
arraylist = [] 
for line in qa_creatives.readlines(): 
arraylist.extend(line.split()) 
qa_creatives.close() 

arraylist = map(int, arraylist) 



authorization_code = raw_input("please enter your authorization code: ") 
creatives = arraylist 
print "Creative Check script is now running, please wait." 

for creative in creatives: 
    url = "http://api.wiki123.com/v1.11/creative?id="+str(creative) 

    header = {"Authorization": authorization_code} 

    response = requests.get(url, headers=header) 

    creative_check = json.loads(response.text) 

final_creative_status = creative_check["response"]["creative"]["is_expired"] 

#print str(creative) + " expired status: " + str(final_creative_status) 

if final_creative_status == False: 
    false_count += 1 
else: 
    true_count += 1 

print "Creative Check Complete:" 

print str(false_count) + " creatives are still valid" 
print str(true_count) + " creatives have expired" 

はこれらのいずれかが要求をGET作るときに返されるJSONデータのサンプルです:

{ 
'response': { 
'count': 1, 
'creative': { 
    'prime_id': 1092343, 
    'off_audit': None, 
    'allow_audit': False, 
    'allow_ssl_audit': False, 
    'audit_feedback': None, 
    'audit_status': 'no_audit', 
    'backup_upload_status': None, 
    'brand': { 
    'category_id': 0, 
    'id': 1, 
    'name': 'Unknown' 
    } 
    }}} 

奇妙なことは、このスクリプトは、いくつかの作品ということです他の時代、私は次のエラーが発生します:KeyError: 'creative'。私は、私の要求が毎回同じことを返すべきであり、キーが決して変わるべきではないので、私はこれに困惑しています。誰がここで何が起こっているかもしれないと言うことができますか?この問題をどのようにデバッグすることができるかに関する推奨事項はありますか?特定の「クリエイティブ」がループを壊している場合は、それを除外する最善の方法は何でしょうか?ありがとう。

for creative in creatives: 
    url = "http://api.wiki123.com/v1.11/creative?id="+str(creative) 

    header = {"Authorization": authorization_code} 

    api_response = requests.get(url, headers=header) 

    creative_check = json.loads(api_response.text) 

    creative_status = creative_check.get("response", 
    {}).get("creative{}).get("is_expired", None) 


if creative_status is None: 
    pass 

elif creative_status == True: 

    true_count += 1 
else : 

    false_count += 1 

print "Creative Check Complete: " 

print str(false_count) + " creatives are still valid" 
print str(true_count) + " creatives have expired" 

注:さて、私はバックキーエラーを受信しませんが、私のスクリプトが終了した後false_countとtrue_countのための私のカウントの両方は常に0です。私のループのコードを更新し

+1

どうやら、いくつかの時間が応答が* *その中に 'creative'で辞書を返しません。 –

+0

これは私が想像していることです...特定の「創造的な」GET要求が「クリエイティブ」キーを含むデータを返さない場合、それらのデータを吐き出す良い方法はありますか?または、具体的には、それらを別のリストに入れますか? – user7681184

+1

...あなたは 'KeyError'をキャッチしてそれに応じて処理することができます...いいえ? –

答えて

1

は、このソリューションをお試しください:

for creative in creatives: 
    url = "http://api.wiki123.com/v1.11/creative?id="+str(creative) 
    header = {"Authorization": authorization_code} 
    response = requests.get(url, headers=header) 
    creative_check = json.loads(response.text) 

    creative_status = creative_check.get("response", {}).get("creative", {}).get("is_expired", None) 
    if creative_status is None : 
     ## That means that the key 'is_expired' does not exist. ## 
     ## You can handle this case here or just pass ## 
     pass 
    elif creative_status : 
     # 'is_expired' is True 
     true_count += 1 
    else : 
     # 'is_expired' is False 
     false_count += 1 
+0

ありがとうございました。私は元の投稿に私のforループのための私の更新されたコードを追加しました。さて、私はキーエラーを返すことはありませんが、私のスクリプトが終了すると、 "false_count"と "true_count"の両方のカウントが常に "0"になります。私は間違ったことをする必要があります。助言がありますか?ありがとう。 – user7681184

+0

1。これは、行10に文法エラーがあるようです: 'get(" creative {}) 'は' get( "creative"、{}) 'でなければなりません2. false_countとtrue_countの両方が0なら、 'is_expired 'is not exist。3.' is_expired 'が存在し、TrueかFalseのいずれかであることを確認するために、いくつかのjsonデータを投稿できますか? –

+0

また、if - elseをforループから外した場合、最後の 'creative_status'にのみ適用されます –

0

あなたの問題はここにある:

final_creative_status = creative_check["response"]["creative"]["is_expired"] 

あなたは存在しませんJSONのオブジェクトでアクセスしたいです。例外をキャッチしたり、このような条件を配置しよう-除くKeyError例外を置く:

if 'creative' in creative_check["response"].keys(): 
    if 'is_expired' in creative_check["response"]["creative"].keys(): 
     blablabla 

私はあなたのJSONでこれらのオブジェクトを存在しないことを確信しています。

関連する問題