2017-11-06 3 views
2

Ich bin ein Anfänger Python-Benutzer. Probleme beim Abrufen von Daten aus CSV in Python im erforderlichen Objektformat, um eine Python-Funktion zu erfüllen. Wenn ich erstellt die Daten manuell in Python (anstatt sie in von csv bringen) der folgende Code funktioniert:Wie bekomme ich Daten von CSV in ein Python-Objekt

class Student(object): 
    pass 

john = Student() 
#score tuple 
john.score = (85.0, 42.0/2.0) 

bob = Student() 
bob.score = (45.0, 19.0/2.0) 

john.rank = 1 
bob.rank = 2 

ExternalCode.AdjustStudents([john, bob]) 

Allerdings muss ich es automatisch arbeiten und nicht manuell tippen jedes Mal, da es die Daten müssen Es wird Tausende von Updates geben - daher die Notwendigkeit, die Daten von csv einbringen zu können.

Das CSV-Datei-Format ist: john, 85, 21, 1 bob, 45, 9,5, 2

Studenten Objekte würden ein Punktzahl Attribut (Spalten 2 und 3 als Tupel) sowie eine Rangattribut (Spalte 4). Das erforderliche Objektformat ist das gleiche wie das obige manuelle Coding.

Ein Beispiel für das gewünschte Format durch den manuellen Code erzeugt, ist, dass, wenn ich den folgenden Druck nach dem manuellen Code tun:

print(" John: score1={0[0]:.3f} score2={0[1]:.3f}".format(john.skill)) 

ich dieses Ergebnis:

John: SCORE1 = 25,000 SCORE2 = 8,333

Cheers,

Steve

+1

Was ist "das gewünschte Objekt Format"? Erwägen Sie das Hinzufügen kurzer CSV-Beispieldaten und zeigen Sie, wie die Daten beim Importieren dargestellt werden sollen. –

+0

Das CSV-Dateiformat wäre wie folgt: – user8891420

+0

Fügen Sie eine verkürzte Version Ihrer CSV-Datei und die gewünschte Ausgabe der Frage. – skrx

Antwort

0

Wenn ich Sie richtig verstehe, fragen Sie, wie Sie create variables dynamically. Das globals() dict zu manipulieren, um neue Variablen zu erstellen, ist keine gute Idee und Sie sollten lieber eine Liste oder ein Wörterbuch verwenden, um Ihre CSV-Daten zu speichern.

Sie scheinen eine Liste zu müssen, so:

  1. die Liste definieren (student_list im Beispiel unten).
  2. Öffnen Sie die CSV-Datei.
  3. Erstellen Sie eine csv.reader.
  4. Iterieren Sie über die Zeilen.
  5. Konvertieren Sie die Zahlen in Floats.
  6. Erstellen Sie eine Student Instanz und übergeben Sie den Namen und die Nummern.
  7. Schließlich fügen Sie diese Student-Instanz an die student_list.

Also, wenn Sie Ihre CSV-Datei so aussieht,

name,score1,score2,rank 
john,85,21,1 
sarah,72,19,2 
bob,45,19,3 

versuchen, den folgenden Code:

import csv 


class Student: 

    def __init__(self, name, score, rank): 
     self.name = name 
     self.score = score 
     self.rank = rank 


student_list = [] 

with open('temp.csv', newline='') as csv_file: 
    reader = csv.reader(csv_file) 
    next(reader, None) # Skip the header. 
    # Unpack the row directly in the head of the for loop. 
    for name, score1, score2, rank in reader: 
     # Convert the numbers to floats. 
     score1 = float(score1) 
     score2 = float(score2) 
     rank = float(rank) 
     # Now create the Student instance and append it to the list. 
     student_list.append(Student(name, (score1, score2), rank)) 

# Then do something with the student_list. 
+0

Danke skrx. Scheint nah zu sein. Aber wenn ich den folgenden Druck nach dem manuellen Code mache: print ("John: score1 = {0 [0]: 3f} score2 = {0 [1]: 3f}". Format (john.skill)) Ich bekomme das folgende ergebnis: John: score1 = 25.000 score2 = 8.333 Wenn ich nach dem csv-code von oben den gleichen druckcode mache, bekomme ich: NameError: name 'john' ist nicht definiert. Es scheint also nicht die gleiche Ausgabe zu erzeugen. – user8891420

+0

Es gibt keine 'John'-Variable mehr, weil alle Studenteninstanzen jetzt in der Liste sind. Wenn Sie auf die Schüler mit Namen zugreifen möchten, sollten Sie sie lieber in ein [Wörterbuch] (https://www.python-course.eu/python3_dictionaries.php) anstatt einer Liste einfügen und auf diese Weise auf folgende Weise zugreifen: 'student_dict ['John'] '. Die Student-Klasse wäre in diesem Fall eigentlich unnötig. – skrx

+0

Danke skrx. Das Hauptziel des Codes besteht darin, den Funktionsaufruf zu erhalten, der mit den manuellen Daten arbeitet, d.h. ExternalCode.AdjustStudents ([John, Bob]), die mit dem dynamischen Code/den dynamischen Daten arbeiten. Wenn ich diesen Funktionsaufruf den unteren Rand Ihres Codes aufrufe und in student_list anstelle von [john, bob] einfüge, scheint es nicht zu funktionieren. Wie würdest du diesen Funktionsaufruf zur Arbeit bringen? – user8891420

0

Sie können CSV-Datei mit Hilfe von Pandas lesen.

In Pandas gibt es read_csv("filename/filepath") Funktion, die Daten aus der CSV-Datei liest und speichert es als ein Array.

+0

Hallo Kimkevin, ich habe Pandas vor dem Posten versucht. Ich konnte die Daten in Python fein importieren, hatte aber immer noch Schwierigkeiten, die Daten im oben beschriebenen Objektformat zu bekommen. – user8891420