好的,这里是:我有一个自定义类,我创建了在列数据中存储多个字段,因为我逐行遍历文件的内容。我想每次重用一个对象,一次一个地向其字段添加项目,然后在运行将所有字段重置为空字符串的方法之前将该对象添加到列表中。我将向您展示我的代码正在做的简化版本。
class MyClass:
firstName = ""
middleName = ""
lastName = ""
def clearAllFields(self):
self.firstName = ""
self.middleName = ""
self.lastName = ""
myClassImpl = MyClass()
nameData = []
for current in open('nameList.csv','r'):
current = current.split(',')
myClassImpl.firstName = current[0]
myClassImpl.middleName = current[1]
myClassImpl.laststName = current[2]
nameData.append(myClassImpl)
myClassImpl.clearAllFields()
for item in nameData:
print item.firstName
问题是,此代码的输出是列表中最后一个人的名字,对文件中的每一行重复一次。我做错了什么?
答案 0 :(得分:2)
您无法重复使用此类实例;你一遍又一遍地修改同一个对象。 nameData.append(myClassImpl)
将引用添加到列表中,而不是副本。最后,您有一个引用列表,所有引用都指向同一个副本,这只会显示您最后一次更改。
为每一行创建一个新实例:
class MyClass:
def __init__(self, first, middle, last):
self.firstName = first
self.middleName = middle
self.lastName = last
for current in open('nameList.csv','r'):
current = current.split(',')
myClassImple = MyClass(*current)
nameData.append(myClassImpl)
或使用collections.namedtuple()
class。
更好的是,使用csv
module来读取CSV数据,而不是自己解析:
import csv
from collections import namedtuple
MyClass = namedtuple('MyClass', 'firstName middleName lastName')
with open('nameList.csv','r') as infh:
nameData = [MyClass(*row) for row in csv.reader(infh)]