2017-10-21 11 views
0

でテキストファイルを介して:私のプログラムでループ私はこのレイアウトに定めたテキストファイル持っ入力

Greg,Computer Science,Hard,5

Alex,Computer Science,Medium,2

Fiona,Maths,Easy,0

Cassie,Maths,Medium,5

Alex,Maths,Medium,1

を私は、ユーザーが特定の名前を選択し、その結果を見ることができるようにしたいです。このための私のコードは次のようになります。

name = input("Enter name: ") 
for each in file: 
    each = each.split(",") 
    realName = each[0] 
    subject = each[1] 
    difficulty = each[2] 
    score = each[3] 
    if name == realName: 
     print(subject, difficulty, score) 
     break 
else: 
    print() 
    print("Invalid name.") 
    name = input("Re-enter your name: ") 

いくつかのことががそれと間違っていると私は何をすべきかを把握することはできません。

  1. ユーザーは「アレックス」を入力した場合、一つだけ彼の結果の表示されます。
  2. 誤った名前を1回入力すると、入力された名前が1回おきに「無効」に戻ります。
  3. 正しい名前が入力され、結果が表示された場合、プログラムは引き続き名前を要求します。

これらの問題を解決する方法はありますか?

答えて

0

ファイルを繰り返し照会する場合は、事前にデータを辞書にプリロードし、必要に応じてデータを印刷することをおすすめします。これは次のようなものです。

data = {} 
with open('file.txt', 'r') as file: 
    for line in file: 
     realName, subject, difficulty, score = each.split(',') 
     data.setdefault(realName, []).append((subject, difficulty, score)) 

while True: 
    name = input('>>> ') 
    data.get(name, 'Invalid Name') 

これは、問題1と2を解決します。あなただけの最初の有効な名前が入力された後にブレークしたい場合は、dict.getの戻り値を照会できます。

while True: 
    name = input('>>> ') 
    result = data.get(name) 
    if result: 
     print(result) 
     break 

    print('Invalid name') 

これは、問題3を解決します。

+0

私は非常にPythonに新しいので、5行目が何を言っているのか分かりません。また、それを私のプログラムにコピーして実行したとき、 'AttributeError: 'list'オブジェクトには属性 'setdefault''がありませんでした。 –

+0

@ GregD'Silvaああ、シャック。 '{}'ではなく '{} 'であったはずです。編集を参照してください。 –

+0

@ GregD'Silvaあなたの質問に答えられたら、[回答を受け入れる](https://stackoverflow.com/help/someone-answers)をお願いします。ありがとう。 –

0

ファイルの構文がシンプルなCSVであるため、csv moduleを使用する方がよいでしょう。

次に、行をループすることができます(各行は値の配列になります)。

import csv 

def parse_csv_file(csv_file, operation, value, index): 
    with open(csv_file, newline='') as file: 
     reader = csv.reader(file, delimiter=',', 
          quotechar='|') 
     return operation(reader, 
         value, index) 


def find_first_row(csv_reader, value, index): 
    for row in csv_reader: 
     if row[index] == value: 
      return row 
    return None 


def main(): 

    query = input('Enter a name: ') 

    result = parse_csv_file('file.csv', 
          find_first_row, 
          query, 0) 

    if result: 
     print(result) 
    else: 
     print('Nothing found!') 

main() 
+0

OPのファイルを解析するためにCSVに切り替えることは、直接の問題を解決しません。 –

+0

CSVを解析する方法を示すサンプルコードが追加されました。 – gchiconi

関連する問題