2016-04-25 8 views
0

Ich schreibe gerade ein Skript, wo ich eine csv-Datei ('tableau_input.csv') zusammen mit anderen Spalten und Spalten csv-Dateien erstellt von mir erstellt. Ich habe versucht, den folgenden Code:Spalte von einer .csv zu einer anderen .csv-Datei hinzufügen mit Python

def make_tableau_file(mp, current_season = 2016): 
    # Produces a csv file containing predicted and actual game results for the current season 
    # Tableau uses the contents of the file to produce visualization 

    game_data_filename = 'game_data' + str(current_season) + '.csv' 
    datetime_filename = 'datetime' + str(current_season) + '.csv' 

    with open('tableau_input.csv', 'wb') as writefile: 
     tableau_write = csv.writer(writefile) 
     tableau_write.writerow(['Visitor_Team', 'V_Team_PTS', 'Home_Team', 'H_Team_PTS', 'True_Result', 'Predicted_Results', 'Confidence', 'Date']) 

     with open(game_data_filename, 'rb') as readfile: 
      scores = csv.reader(readfile) 
      scores.next() 

      for score in scores: 
       tableau_content = score[1::] 
       # Append True_Result 
       if int(tableau_content[3]) > int(tableau_content[1]): 
        tableau_content.append(1) 
       else: 
        tableau_content.append(0) 
       # Append 'Predicted_Result' and 'Confidence' 
       prediction_results = mp.make_predictions(tableau_content[0], tableau_content[2]) 
       tableau_content += list(prediction_results) 

       tableau_write.writerow(tableau_content) 

     with open(datetime_filename, 'rb') as readfile2: 
      days = csv.reader(readfile2) 
      days.next() 

      for day in days: 
       tableau_write.writerow(day) 

'tableau_input.csv' ist die Datei, die ich bin zu schaffen. Die Spalten 'Visitor_Team', 'V_Team_PTS', 'Home_Team', 'H_Team_PTS' stammen von 'game_data_filename' (z. B. tableau_content = score [1 ::]). Die Spalten 'True_Result', 'Predicted_Results', 'Confidence' sind Spalten, die in der ersten for-Schleife erstellt wurden. Bis jetzt funktioniert alles, aber schließlich habe ich versucht, die 'Date'-Spalte Daten aus dem' datetime_filename 'mit der gleichen Struktur wie oben hinzuzufügen, aber wenn ich meine' tableau_input 'Datei öffne, gibt es keine Daten in meiner' Date 'Spalte . Kann jemand dieses Problem lösen?

Für Informationen, unten sind Screenshots von CSV-Dateien jeweils für 'game_data_filename' und 'datetime_filename' (nb: Datums- und Uhrzeitwerte sind in Datetime-Format) enter image description here

enter image description here

+0

Was haben Sie mit dem Debugger versucht? Öffnet die Datei mit Inhalt in 'readfile2'? Auch dies wird vermutlich alle Eingabezeilen zuerst schreiben, und dann alle Datenzeilen unten, wollen Sie nicht beide Dateien öffnen, beide zusammen anfügen und dann schreiben sie? –

+0

Ja, ich habe Inhalt in readfile2 (datetime-Werte) und ja im Grunde ist die Idee append Inhalt beider Dateien in meiner neuen csv-Datei 'tableau_input'. Das habe ich nicht bemerkt. Hast du einen Weg, dies zu erreichen? – DiamondDogs95

+0

Haben Sie die Datumszeile am Ende der Datei? –

Antwort

0

Es ist schwer, das, wie ich zu testen nicht wirklich wissen, was die Eingabe aussehen sollte, aber so etwas wie dies versuchen:

def make_tableau_file(mp, current_season=2016): 
    # Produces a csv file containing predicted and actual game results for the current season 
    # Tableau uses the contents of the file to produce visualization 

    game_data_filename = 'game_data' + str(current_season) + '.csv' 
    datetime_filename = 'datetime' + str(current_season) + '.csv' 

    with open('tableau_input.csv', 'wb') as writefile: 
     tableau_write = csv.writer(writefile) 
     tableau_write.writerow(
      ['Visitor_Team', 'V_Team_PTS', 'Home_Team', 'H_Team_PTS', 'True_Result', 'Predicted_Results', 'Confidence', 'Date']) 

     with open(game_data_filename, 'rb') as readfile, open(datetime_filename, 'rb') as readfile2: 
     scoreReader = csv.reader(readfile) 
     scores = [row for row in scoreReader] 
     scores = scores[1::] 
     daysReader = csv.reader(readfile2) 
     days = [day for day in daysReader] 
     if(len(scores) != len(days)): 
      print("File lengths do not match") 
     else: 
      for i in range(len(days)): 
       tableau_content = scores[i][1::] 
       tableau_date = days[i] 
       # Append True_Result 
       if int(tableau_content[3]) > int(tableau_content[1]): 
        tableau_content.append(1) 
       else: 
        tableau_content.append(0) 
       # Append 'Predicted_Result' and 'Confidence' 
       prediction_results = mp.make_predictions(tableau_content[0], tableau_content[2]) 
       tableau_content += list(prediction_results) 
       tableau_content += tableau_date 

       tableau_write.writerow(tableau_content) 

diese beiden der Datei kombiniert Teile in einem zu lesen.

Wie pro Ihre Fragen unter:

scoreReader = csv.reader(readfile) 
scores = [row for row in scoreReader] 
scores = scores[1::] 

Diese nutzt Liste Verständnis eine Liste namens scores, mit jedem Element ist eine der Reihen von scoreReader zu erstellen. Als scorereader ist ein generator, jedes Mal wenn wir es um eine Zeile bitten, spuckt es für uns aus, bis es keine mehr gibt.

Die zweite Zeile scores = scores[1::] hackt nur das erste Element der Liste ab, da Sie die Kopfzeile nicht möchten.

Für weitere Informationen zB diese:

Generators on Wiki
List Comprehensions

Viel Glück!

+0

Es klingt gut. Ich habe das versucht, aber es wirft mich ein "TypeError: Objekt des Typs '_csv.reader' hat keine len()" – DiamondDogs95

+0

Ich habe versucht, "für i in Bereich (Grenze)" durch "für i in Partituren:" zu ersetzen und bekam loswerden von "limit" var. Aber es wirft einen anderen 'TypeError:' _csv.reader 'Objekt hat kein Attribut' __getitem__ '' auf diese Zeile: "tableau_content = scores [i] [1 ::]" – DiamondDogs95

+0

Es löst diesen Fehler, weil csv.reader() Objekt ist keine Sequenz und wir können nicht auf Zeilen nach Index zugreifen. – DiamondDogs95

Verwandte Themen