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