新类没有setItem方法

2024-09-28 19:01:25 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,这是我的密码。在

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文件,并从字段名自动生成对象名。在

提前谢谢你。在


Tags: csvinself密码forinitdefline
2条回答

如果我能正确推断您的意图,您需要替换这行:

self[firstLine[i]] = line[i]

有了这个:

^{pr2}$

这将为您的newClass对象创建一个以数据中的列命名的属性。在

例如:

Name, Date, Weight
Joe, 23-Sep, 99
...

以及

data = classMaker('file.csv') 

将产生:

data[0].Name == 'Joe'

另外,假设您将添加文件I/O、解析CSV文件和其他缺少的元素。在

p.p.s:您可以完全避免循环计数器i

for attr, val in zip(firstLine, line):
  setattr(self, attr, val)

p.p.s:这是一个完整的工作样本:

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

如果使用^{},则可以同时避免newClass

CSVRow = namedtuple("CSVRow", firstLine)
return [CSVRow(*line) for line in csv]

这假设CSV头将是有效的Python标识符(也就是说,如果您有像“somevalue”这样的实体,那么如果您不处理firstLine,那么这将不起作用。在

这将允许您执行以下操作:

^{pr2}$

另外,您应该查看^{} module,以简化CSV处理。在

相关问题 更多 >