2016-04-30 3 views
0

私は現在、私と友人の間の競争としてクイズを制作中で、私が比較的新しいプログラミングについて少し学びます。私のプログラムは、クイズを使用する各ユーザーの最後の3つの結果を保持し、最も古い結果を最新のものに置き換えます。私が到達した現在の段階では、ユーザーがファイルに自分の名前を持っているかどうかをチェックすることができます。csvファイル内の特定のデータを置換する

if team == 'Team 1': 
     path = 'team1scores.csv' 

    elif team == 'Team 2': 
     path = 'team2scores.csv' 

    elif team == 'Team 3': 
     path = 'team3scores.csv' 

    else: 
     print("--Error Defining File Path--") 

with open(path, 'rt') as csvfile: 
    ver_read = csv.reader(csvfile, delimiter =",") 
    ver_write = csv.writer(csvfile, delimiter =",") 
    for row in ver_read: 
     if user in row: 
      row_data = list(ver_read) 
      row_len = len(row_data) 
      if row_len >= 3: 
      >>> The Problem is here 

     else: 
      with open(path, 'a+', newline='') as csvfile: 
       csvwriter = csv.writer(csvfile, delimiter=',') 
       csvwriter.writerows(datacsv) 

私はプログラムを持っている問題は、結果を交換することができるという、私はすでに3つの入力を持つ私のcsvファイルに以下のデータを持っていたと言っています。これらは2つの異なる列に保持する必要があります。ソート機能を追加する予定です。

Jake,5 
Jake,7 
Jake,2 
Max,9 
Lee,8 

私は上記のコードに基づいて何回か実験しましたが、プログラムが情報交換の状況に達すると混乱します。これまで私はファイル全体を上書きすることができましたが、特定のデータは上書きできませんでした。

ver_writeは、次の手順で必要になりますか?

編集:私は今、更新されたバージョンを持っているが、まだ同じ問題を抱えている 、このプログラムは、私の基準に適合する2PSの答えから構成されています。上書きする必要があり、名前とスコアの2つの異なるセルに印刷する必要があります。私が必要とするものの基礎はありますが、うまくいきません。

from collections import OrderedDict 
user_data = OrderedDict() 
data_to_write = [] 
with open(path, 'r+') as csvfile: 
    ver_read = csv.reader(csvfile, delimiter =";") 
    for x, row in enumerate(ver_read): 
     if user == row[0]: 
      user_data[x] = row 
     else: 
      data_to_write.append(row) 
    if len(user_data) > 2: 
     keys = user_data.keys()[-2:] 
     for x in keys: 
      data_to_write.append(user_data[x]) 
      data_to_write.append(datacsv) 
      with open(path, 'w') as csvfile: 
       ver_write = csv.writer(csvfile, delimiter=",") 
       ver_write.writerows(data_to_write) 
    else: 
     with open(path, 'a+', newline='') as csvfile: 
      csvwriter = csv.writer(csvfile, delimiter=',') 
      csvwriter.writerows(datacsv) 

私はここで何か根本的に間違っていますか?

+0

あなたは何の問題がありますか?あなたのロジックを実装する方法や例外があるかどうかわからないのですか?また、完全なコードを表示し、入力と期待される出力の例を挙げてください。 – chinglun

+0

パンダライブラリーの使用を検討しましたか?このようなことはずっと簡単です。データフレームの操作をはるかに迅速に行うことができます。また、3つではなく、1つのファイルにデータを保存しようと思います。おそらく、チーム/個人がクイズを取っていることを示す列を持つだけの方がよいでしょう。 – flyingmeatball

+0

「John、4」行の順序は重要です(つまり、すべてのJohnのスコアをグループ化しても問題ありません)。 –

答えて

0
from collections import OrderedDict 
user_data = OrderedDict() # dict to hold all matching rows for the user, keyed off of line number 
data_to_write = [] 
with open(path, 'r') as csvfile: # read-write mode for file 
    ver_read = csv.reader(csvfile, delimiter =",") 
    for x, row in enumerate(ver_read): 
     if user == row[0]: 
      user_data[x] = row 
     else: 
      data_to_write.append(row) # store it for afterwards 
    if len(user_data) >= 3: 
     keys = user_data.keys()[-2:] # Grab the last two scores in the file 
     for x in keys: 
      data_to_write.append(user_data[x]) 
     # Write the contents of the new score here: 
     data_to_write.append(. . . . .) 
with open(path, 'w') as csvfile: 
    # finally write the changes to file 
    ver_write = csv.writer(csvfile, delimiter=",") 
    ver_write.writerows(data_to_write) 
+0

私は問題に遭遇しました。名前とスコアのセルが1つのセルに結合されました。どんな解決策ですか? –

+0

また、データが上書きされておらず、結果の間に1つのセルギャップが残っています。 –

+0

user_dataがコードのどこかで動作していないようです。何か案は? –

0

あなたは多分このような何かを試みることができる:

data_to_write = [] 
with open(path, 'r+') as csvfile: # read-write mode for file 
    ver_read = csv.reader(csvfile, delimiter =",") 
    row_data = list(ver_read) 

    for row in row_data: 
     if user in row: 
      if row_data.index(row) >= 3: # if we found the user in a row after 3 
       row = [] # change the information here to whatever suits you 
      else: 
       row = [] # or here depending on your logic 
     data_to_write.append(row) # store it for afterwards 

    # finally write the changes to file 
    ver_write = csv.writer(csvfile, delimiter=",") 
    ver_write.writerows(data_to_write) 
1

を私の知る限りでは、あなたがcannot change one row in a file。したがって、完全なファイルを書き直す必要があります。

私はあなたが新しいデータを挿入する方法を知りませんが、あなたは次のことを行うことができます:

import csv 

# Assuming new score 
new_score = ['Jake', '3'] 

# Open the file containing the scores 
with open('scores.csv', 'r') as csvfile: 
    ver_read = csv.reader(csvfile, delimiter=',') 

    # Make a dict that will contain the scores per person   
    names = {} 
    for row in ver_read: 
     # Grab the name and the score 
     name,score = list(row) 

     # If it's not in names yet, put it in and make it a list 
     if name not in names: 
      names[name] = [] 

     # Append the score to the name list 
     names[name].append(score) 

# Add the new score 
names[new_score[0]].append(new_score[1]) 

with open('scores.csv', 'w') as csvfile: 
    # Loop the names in the names dict 
    for name in names: 

     # If the person has more than 3 scores, only take the last 3 
     if len(names[name]) > 3: 
      names[name] = names[name][-3:] 

     # For each score, print it 
     for score in names[name]: 
      print('{},{}'.format(name, score)) 
      #ver_write.writerow([name, score]) 

で:

Jake,5 
Jake,7 
Jake,2 
Max,9 
Lee,8 

新しいスコア:

Jake,3 

アウト:

Jake,7 
Jake,2 
Jake,3 
Max,9 
Lee,8 
関連する問題