所以,这是我的代码。

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/

10-12 19:50