1

だから、これは私のコードです。

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 ファイルを取り込み、フィールド名からオブジェクト名を自動生成することです。

前もって感謝します。

4

2 に答える 2

2

あなたの意図を正しく推測できる場合は、次の行を置き換えてください。

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'

Ps ファイル I/O を追加し、CSV ファイルを解析し、その他の欠落している要素を追加すると仮定します。

Pps: ループ カウンターを完全に回避できiます。

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

Pps: これは完全な作業サンプルです:

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
于 2013-07-24T18:04:36.723 に答える