2012-01-09 4 views
2

私はCSVファイルを解析するはずのPythonコードをいくつか書いています。特定の行の平均値を計算し、CSVファイルの1行の値に基づいて受信者に電子メールを送信します。次のように私のコードは、私は今のコードを送信した電子メールを削除し、print文に置き換えました:リストの補完を実行した後でループがdictで機能しない

def main(): 
    #smtp_instance = smtplib.SMTP('localhost') 
    ldap_file = open('ldaps.csv','rU') 
    ldap_data=csv.DictReader(ldap_file) 
    scores = list(int(d['score']) for d in ldap_data) 

    average_score = sum(scores)/len(scores) 
    print average_score 

    for rows in ldap_data: 
    ldap = rows['ldap'] 
    fullname = rows['fullname'] 
    firstname = fullname.split(' ')[0] 
    location = rows['location'] 
    score = rows['score'] 
    if int(score) < average_score: 
     score_msg = 'below' 
    else: 
     score_msg = 'above' 

    print 'Hi ' + firstname + '\n'\ 
      'You got a ' + score + '% on your Final Exam.'\ 
      'The average score was ' + average_score + '.'\ 
      'This means that you scored ' + score_msg + ' average.' 

if __name__ == '__main__': 
    main() 

私はこれを実行すると、それはaverage_score値を出力します。しかしコードはfor..loopに決して行きません。私はディクテーションでリスト内包を呼び出すことはできないと思われ、同じディクテーションで繰り返します。どのようなアイデアを私は間違っていると私はそれを修正することができますか?

+0

後のリストにそれをコピーしてください。あるいは、 'pdb'を使ってステップを進め、同じことをチェックしてください。 – Useless

答えて

6

リーダーオブジェクトcsvモジュールによって返されたモジュールはジェネレータとして振る舞いますが、それらは一度しか反復できません。あなたが繰り返し反復することができ、実際のリストが必要な場合は、明示的に作成する必要があります:ldap_dataのみイテレータプロトコルをサポートしている読者のオブジェクトであるため、

ldap_data = list(csv.DictReader(ldap_file)) 
+0

これは魅力的な作品です – jwesonga

1

このライン

scores = list(int(d['score']) for d in ldap_data) 

ldap_data内のすべてのデータを消費します。 ldap_dataは、ファイルldap_fileの基礎となるデータによって駆動されるイテレータです。 ldap_dataを反復すると、基礎となるファイルldap_fileが消費されます。

したがってldap_dataは、for-loopに達すると空です。一つの方法は、この周り

for rows in ldap_data: 

ldap_dataリストを作ることです。

ldap_data = list(csv.DictReader(ldap_file)) 

これを回避するもう1つの方法は、再び最初から読むためにldap_fileを伝えることです:

scores = list(int(d['score']) for d in ldap_data) 
... 
ldap_file.seek(0) 
... 
for rows in ldap_data: 
1

だこと。それはあなたがscoresリストを作成するときに行う、一度しか反復することができないことを意味します。

ファイルをコレクションに入れるか、ファイルが大きすぎる場合は、再度ループしてから読み込んでください。

0

どのような種類のLDAPデータですか?

私はそれがイテレータでありリストではないので、それを一度反復すると(リスト内包など)、次回反復しようとするとすぐに「StopIteration」がスローされます。

あなたはそれが傷つくと思う場合だけ、前と理解した後 `ldap_data`を印刷してみてください、すぐに

ldap_data = csv.DictReader(ldap_file) 
ldap_data = list(ldap_data) 
関連する問題