2017-04-14 163 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]) 
相關問題