所以,这是我的代码。
def classMaker(csv):
csv = csv.split("/n")
firstLine = csv[0]
csv = csv[1:]
class newClass():
def __init__(self, line):
self.vars = firstLine
for i in range(len(line)):
self[firstLine[i]] = line[i]
return [newClass(line) for line in csv]
问题是self [firstLine [i]] = line [i]中的AttributeError。它说
AttributeError: newClass instance has no attribute '__setitem__'
我不知道为什么会导致此错误。我的目标是接收从Excel导出的csv文件,并根据字段名称自动生成对象名称。
先感谢您。
最佳答案
如果我可以正确推断出您的意图,请替换此行:
self[firstLine[i]] = line[i]
有了这个:
setattr(self, firstline[i], line[i])
这将为您的
newClass
对象创建一个属性,该属性以数据中的列命名。例如。:
Name, Date, Weight
Joe, 23-Sep, 99
...
和
data = classMaker('file.csv')
将产生:
data[0].Name == 'Joe'
P.s.我假设您将添加文件I / O,解析CSV文件以及其他缺少的元素。
提示:您可以完全避免循环计数器
i
:for attr, val in zip(firstLine, line):
setattr(self, attr, val)
提示:这是一个完整的工作示例:
import csv
def classMaker(filename):
class newClass(object):
def __init__(self, line):
for attr, val in zip(firstLine, line):
setattr(self, attr, val)
with open(filename, 'rb') as csvfile:
spamreader = csv.reader(csvfile)
firstLine = spamreader.next()
return [newClass(line) for line in spamreader]
x = classMaker("/tmp/x.csv")
print x[0].Name
关于python - 新类没有setItem方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17841441/