Fügen Sie mithilfe von setattr of python dynamisch den CSV-Header als Attributnamen der Modellklasse hinzu

Python hat ein praktisches Modul, das CSV lädt, oder? Ich habe versucht, damit einen DB-Testdatensatz einzufügen. Zu diesem Zeitpunkt ändert sich der Quellcode aufgrund der Änderung des Spaltenwerts und der Modellklasse, wenn jeder CVS-Spaltenwert dem Modell zugewiesen wird, indem der Attributname wie unten gezeigt beschrieben wird. Wir werden umgestalten, um dies zu beseitigen.

Der Nutzen und die Verwendung von setattr können durch Reflect verstanden werden, aber ich denke, dieses Beispiel ist leichter zu verstehen.

Die Ausführungsumgebung wird als Python 3.4.3 angenommen.

import csv

class Model():
    pass

if __name__ == '__main__':
    models = []
    with open('person.csv', 'r') as f:
        reader =  csv.reader(f)
        #Lesen Sie nur eine Zeile (Kopfzeile)
        Model._columns = next(reader)
        for row in reader:
            model = Model()
            #Dynamisch festgelegte Attribute im Modell
            for i in range(len(row)):
                model.coulmn1 = row[0]
                model.coulmn2 = row[1]
            models.append(model)

Verwenden Sie setattr, um Attribute festzulegen

Ich werde die CSV-Datei veröffentlichen, die dieses Mal zuerst verwendet werden soll.

id,name,age
1,Taro,19
2,Ziro,18
3,Mikio,40
4,Mineko,38

Python verfügt über eine integrierte Funktion namens setattr. Wird als setattr (Objekt, Attributname, Wert) verwendet. Das Gute daran ist, dass Sie den Attributnamen mit einer Variablen angeben können. Wenn Sie es auf "obj.var1" setzen, wird in obj nach var1 gesucht. Wenn Sie möchten, dass var1 als Variable erweitert wird, verwenden Sie setattr ().

import csv

class Model():
    pass

if __name__ == '__main__':
    models = []
    with open('person.csv', 'r') as f:
        reader =  csv.reader(f)
        #Lesen Sie nur eine Zeile (Kopfzeile)
        columns = next(reader)
        for row in reader:
            model = Model()
            #Dynamisch festgelegte Attribute im Modell
            for i in range(len(row)):
                setattr(model, columns[i], row[i])
            models.append(model)

    for model in models:
        print(model)

# =>
# <__main__.Model object at 0x1053169b0>
# <__main__.Model object at 0x105316a58>
# <__main__.Model object at 0x105316b00>
# <__main__.Model object at 0x105316ba8>

Behalten Sie die Reihenfolge der Attributliste bei

Wenn es unverändert bleibt, wird das Attribut des Objekts nicht ausgegeben. Selbst wenn Sie kein Verzeichnis verwenden, wird es standardmäßig ausgegeben. In Python wird beim Drucken mit einer print-Anweisung eine spezielle Methode namens "str" ausgeführt. Sie müssen lediglich die Zeichenfolge zurückgeben, die Sie mit dieser Methode anzeigen möchten.

Diejenigen, deren Präfix nicht _ (Unterstrich) ist, werden von der Anzeige ausgeschlossen. Wenn Sie damit eine Methode für die interne Verarbeitung in Model definieren möchten, können Sie _ (Unterstrich) hinzufügen.

import csv

class Model():
    #Weil es in der Anzahl der Attribute im Vergleich zur Länge des Elements enthalten ist
    #Fügen Sie eine Unterleiste hinzu
    _columns = []

    def __init__(self):
        if len(self._columns) == 0:
            raise Exeption("Please set the columns of %s" % self)

    def __str__(self):
        attribute_str = ""
        #Das Präfix ist_Ausschließen
        attributes = list(filter(
                            lambda attribute_name: not(attribute_name[0].startswith("_")),
                            dir(self)))

        if len(attributes) == len(self._columns):
            #Verweisen Sie auf die Klassenvariable, da self keine Spalten hat
            for attribute in self._columns:
                attribute_str += "%s = %s \n" % (attribute,
                                                 getattr(self, attribute))
        else:
            raise Exception("Incorrect the number of %s.columns" % self)

        return attribute_str

if __name__ == '__main__':
    models = []
    with open('person.csv', 'r') as f:
        reader =  csv.reader(f)
        #Lesen Sie nur eine Zeile (Kopfzeile)
        Model._columns = next(reader)
        for row in reader:
            model = Model()
            #Dynamisch festgelegte Attribute im Modell
            for i in range(len(row)):
                setattr(model, Model._columns[i], row[i])
            models.append(model)

    for model in models:
        print(model)

# =>
# id = 1 
# name = Taro 
# age = 19 
# 
# id = 2 
# name = Ziro 
# age = 18 
# 
# id = 3 
# name = Mikio 
# age = 40 
# 
# id = 4 
# name = Mineko 
# age = 38

Recommended Posts

Fügen Sie mithilfe von setattr of python dynamisch den CSV-Header als Attributnamen der Modellklasse hinzu
Zeichenkodierung bei Verwendung des CSV-Moduls von Python 2.7.3
[Python] Implementierung von Clustering mit einem gemischten Gaußschen Modell
Fügen Sie Attribute von Klassenobjekten mit einer for-Anweisung hinzu
Beispiel für das Abrufen des Modulnamens und des Klassennamens in Python
Namensidentifikation mit Python
[Python3] Formatieren Sie die Zeichenfolge mit dem Variablennamen als Schlüssel