2016-12-03 18 views
3

これは、CSVファイル内の子供の名前を検索して年齢を示す関数def(、)の作成で構成されています。PythonとCSV:行を見つけて列の値を与える

CSVファイルには、このように構成されています。私が試したコードがある一方で

Nicholas,12 
Matthew,6 
Lorna,12 
Michael,8 
Sebastian,8 
Joseph,10 
Ahmed,15 

この:

def fetchcolvalue(kids_agefile, kidname): 

    import csv 

    file = open(kids_agefile, 'r') 
    ct = 0 

    for row in csv.reader(file): 
     while True: 
      print(row[0]) 
      if row[ct] == kidname: 
       break 

イライラする事は、それは私にエラーを与えていないということですが、無限ループ:私はそれが私が間違っていると思う。

これまでのところ、私はこの本から学んだことだけ(ためとながら)をループしているとIF-のelif-他のサイクル、CSV以外の基本的な編集操作をファイルので、私は本当に方法を見つけ出すことはできませんそれらのツールだけで問題を解決できますか?

この機能は、子供のものだけでなく、一般的な2列のCSVファイルで動作する必要があることに注意してください。

+0

もう1つ注意してください。インポートラインを関数から移動する必要があります。輸入は、ほとんど例外なく、スクリプトの一番上になければなりません。輸入に時間がかかり、関数を呼び出すたびにcsvをインポートすると遅くなります。 –

答えて

3

ループ内のwhile Trueは、ループを永久にループさせます(変数はループ内で変更されません)。ちょうどそれを削除します。

for row in csv.reader(file): 
    if row[ct] == kidname: 
     break 
else: 
    print("{} not found".format(kidname)) 

をcsvファイルは時に繰り返し、とすぐrow[ct]は、それが壊れるkidnameに等しいとされます。ファイルが完全にちょうどforループの後elseのいくつかのあまり知られていない使用状況を公開するために(子供の名前を見つけることなくスキャンされた場合、あなたが知っているので

私はelseステートメントを追加します。何breakが発生していない場合は、elseブランチに入ります。)

EDIT:あなたはanyと発電機の理解を使用して1行でそれを行うことができます:

any(kidname == row[ct] for row in csv.reader(file)) 

はおそらく速く、あまりにも、任意の第1のセルと一致した場合Trueを返します。

1

この例では、forループがファイルの最初の行にrowを設定してから、whileループを開始します。 whileループはrowを更新しないので、無限です。 whileループを削除するだけです:

def fetchcolvalue(kids_agefile, kidname): 

    import csv 

    file = open(kids_agefile, 'r') 
    ct = 0 

    for row in csv.reader(file): 
     if row[ct] == kidname: 
      print(row[1]) 
関連する問題