2017-04-14 128 views
0

我有一个CSV文件,该文件是这样的:Python:对象具有相同的值?

1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 
2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 
3;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 
... 
16000;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 

我写了下面的Python脚本:

import csv 

path = 'pathToCSV.csv' 
dLst = [] 

class Datensatz: 
    #0:schluesse 1:straftat 2:gemeindeSchluessel 3:stadt 4:kreisart 5:erfassteFaelle 6:HZnachZensus 
    #7:versucheAnzahl 8:versucheInProCent 9:mitSchusswaffeGedroht 10:mitSchusswaffeGeschossen= 
    #11:aufgeklaerteFaelle 12:aufklaerungsquote 13:tatverdaechtigeInsgesamt 14:tatverdaechtigeM 
    #15:tatverdaechtigeW 16:nichtdeutscheTatverdaechtigeAnzahl 17:NichtdeutscheTatverdaechtigeInProCent 
    datensatz =['','','','','','','','','','','','','','','','','',''] 


def createDatensatz(row): 
    d = Datensatz() 
    for i in range(0,17): 
     d.datensatz[i] = row[i] 
    return d 


def readCSV(): 
    with open(path, 'r', encoding = 'iso-8859-15') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter=';') 
     for row in spamreader: 
      #First print 
      print(createDatensatz(row).datensatz[0]) 
      dLst.append(createDatensatz(row)) 

    for item in dLst: 
     #second print 
     print(item.datensatz[0]) 


if __name__ == "__main__": 
    readCSV() 

对于我的代码的第一个打印,我得到的所有号码从1到16000,其是正确的!

但是,在将对象添加到我的列表后的第二次打印中,我获得了最后一个值的16000倍。

16000 
16000 
16000 
... 
16000 

为什么? 问题在哪里?

+1

'Datensatz.datensatz'是一个类的成员,并Datensatz'的'所有实例之间共享。你必须为你的类创建一个'__init__'并在那里初始化实例成员。 – georg

回答

1

您需要将类的定义移动到datensatz。现在它是一个跨所有实例共享的类变量,因此它保存了最后一行创建的行。

尝试:

class Datensatz: 
    def __init__(self): 
     self.datensatz = ['','','','','','','','','','','','','','','','','',''] 

或更好:

class Datensatz: 
    def __init__(self, row): 
     self.datensatz = row[:] # [:] is making a shallow copy of the list. 


def readCSV(): 
    with open(path, 'r', encoding = 'iso-8859-15') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter=';') 
     for row in spamreader: 
      #First print 
      print(Datensatz(row).datensatz[0]) 
      dLst.append(Datensatz(row)) 

    for item in dLst: 
     #second print 
     print(item.datensatz[0]) 
相关问题