2017-04-14 2 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 

나는 다음과 같은 파이썬 스크립트 작성 : 나는 모든 숫자를 얻을 수 1에서 16000에 내 코드의 첫 번째 인쇄를 들어

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

을하는 맞다!

하지만 내 목록에 개체를 추가 한 후 두 번째 인쇄의 경우 마지막 값의 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]) 
관련 문제