2016-04-30 2 views
0

Ich bin gerade dabei, ein Quiz als ein Wettbewerb zwischen mir und meinen Freunden zu produzieren, und etwas mehr über Programmierung zu lernen, die ich relativ neu bin. Mein Programm soll die letzten 3 Ergebnisse für jeden Benutzer, der das Quiz verwendet, behalten und das älteste Ergebnis durch das neueste ersetzen. Die aktuelle Stufe, die ich erreicht habe, ist in der Lage zu überprüfen, ob der Benutzer seinen Namen in der Datei hat und wenn er nicht wie üblich in die Datei schreibt. in meiner CSV-Datei mit 3 Eingängen bereitsErsetzen bestimmter Daten in einer CSV-Datei

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) 

Das Problem, das ich mit dem Programm haben, ist in der Lage, das Ergebnis zu ersetzen, sage ich unten die Daten hatte. Diese müssen in zwei verschiedenen Spalten gehalten werden. Da ich eine Sortierfunktion eingebaut habe.

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

Ich habe oben mit der Basis des Codes mehrmals experimentiert, aber ich bin verwirrt, sobald das Programm die Situation erreicht, die Informationen zu ersetzen. Bis jetzt konnte ich die gesamte Datei überschreiben, aber keine bestimmten Daten.

Wird die ver_write in den nächsten Schritten erforderlich sein?

Edit: ich jetzt eine aktualisierte Version haben, aber immer noch das gleiche Problem, wird dieses Programm von 2ps Antwort angepasst, um in meine Kriterien passen. Es muss immer noch überschrieben werden und muss für den Namen und die Punktzahl in zwei verschiedene Zellen gedruckt werden. Die Basis ist da für das, was ich brauche, aber es wird nicht funktionieren.

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) 

Mache ich etwas fundamental falsch hier? so etwas wie dies vielleicht

+0

Was ist dein Problem? Wissen Sie nicht, wie Sie Ihre Logik implementieren oder eine Ausnahme haben? Zeigen Sie außerdem den vollständigen Code und geben Sie ein Beispiel für die Eingabe und die erwartete Ausgabe. – chinglun

+0

Haben Sie überlegt, die Pandas-Bibliothek zu verwenden? Es macht diese Art von Sache viel einfacher - Sie können Operationen auf einem Datenrahmen viel schneller durchführen. Ich würde auch versuchen, Ihre Daten in einer einzigen Datei zu speichern, nicht in drei. Es ist wahrscheinlich besser, nur eine Spalte zu haben, die das Team/die Person identifiziert, die das Quiz durchführt. – flyingmeatball

+0

Ist die Reihenfolge der "John, 4" -Reihen wichtig (das heißt, ist es in Ordnung, alle John-Werte gruppiert zu haben)? –

Antwort

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

Ich bin auf ein Problem gestoßen, die Namen und Trefferzellen haben sich zu einer Zelle zusammengeschlossen. Irgendwelche Lösungen? –

+0

Auch die Daten werden nicht überschrieben und lassen mich stattdessen mit einer Zelle Lücken zwischen meinen Ergebnissen. –

+0

Es scheint, dass die user_data nicht irgendwo im Code funktioniert. Irgendwelche Ideen? –

0

Sie könnten versuchen:

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

Soweit ich weiß, Sie cannot change one row in a file. Sie müssen also die komplette Datei neu schreiben.

Ich weiß nicht, wie Sie neue Daten einfügen, aber man konnte folgendes tun:

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]) 

In:

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

Neue Punktzahl:

Jake,3 

Out:

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