1

私はPythonに少し慣れていないので、6.00x(2013年春)のコースに行き詰まっています。新しく見つけた知識を試してみたかったのですが、行き過ぎたようです。

アイデアは、私の銀行取引明細書を含む CSV ファイルを Python にインポートすることでした。次に、各トランザクションをクラスのインスタンスに変換することを望みました。次に、データをいじって何ができるかを確認したいと思っていましたが、最初のハードルでさえ失敗しているようで、オブジェクト指向プログラムにうまく適合させることができませんでした。

私は自分のファイルをインポートするためにこれから始めました:

import csv
datafile = open('PATH/TO/file.csv', 'r')
datareader = csv.reader(datafile)
data = []
for row in datareader:
    data.append(row)

それはうまくいくようです。以下のようなすべての明細書データのリストを取得します (実際のデータをアップロードしていないことは理解できるでしょう...)

[['date', 'type', 'details', 'amount', 'balance', 'accountname', 'accountdetails', 'blank_string'],['date', 'type', 'details', 'amount', 'balance', 'accountname', 'accountdetails', 'blank_string'],['date', 'type', 'details', 'amount', 'balance', 'accountname', 'accountdetails', 'blank_string'],['date', 'type', 'details', 'amount', 'balance', 'accountname', 'accountdetails', 'blank_string']]

したがって、 data[0] と入力すると、次のようになります。

['date', 'type', 'details', 'amount', 'balance', 'accountname', 'accountdetails', 'blank_string']

それで、クラスとコンストラクターを作成しました。これらのトランザクションのそれぞれを簡単にアクセスできるアイテムに分解するという考えで。

class Transaction(object):
    """
    Abstract class for building different kinds of transaction
    """
    def __init__(self, data):
        self.date = data[0]
        self.trans_type = data[1]
        self.description = data[2]
        self.amount = data[3]
        self.balance = data[4]
        self.account_type = data[5]
        self.account_details = data[6]

今入力すると、これが機能することがわかります

T1 = トランザクション (データ [0])

ただし、常に T1 =... T2=... t3=... t4=... と入力する必要はありません。永遠にかかるトランザクションがたくさんあります。

ということでやってみました!

for i in range(len(data)):
eval("T" + str(i)) = Transaction(data[i])

しかし、pythonは本当にそれが好きではありません...それは次のように報告します:

SyntaxError: プログラムにエラーがあります: *関数呼び出しに代入できません (FILENAME.py、80 行目)

だから私の質問はです。eval() 関数を繰り返し使用して、データをインスタンスとしてクラス Transaction(object) に割り当てることができないのはなぜですか?

それを回避する方法がない場合、どうすればそうすることができますか?

また、私の間違いが、オブジェクト指向プログラミングとそれをいつ使用するのが適切なのかについて、私が見逃していることを示唆しているという疑いが長引いています。csvデータをインポートして辞書に入れ、そこから遊んだほうがいいでしょうか?

どうもありがとう!ヒュー

4

1 に答える 1

3

代わりにリストを使用してくださいtransactions = []。単純に.append()新しいTransactionインスタンスです。

transactions = []
for row in datareader:
    transactions.append(Transaction(row))

あるいは:

transactions = [Transaction(row) for row in datareader]

行の結果ごとに個別の変数を作成する必要はありません。

于 2013-04-02T14:44:09.090 に答える