我是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数据作为导入的字典输入到字典中然后从那里开始玩,我会更好吗?

非常感谢!
w

最佳答案

使用transactions = []列表代替,只需.append()新的Transaction实例:

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


甚至:

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


无需为每个行结果创建单独的变量。

关于python - Python-自动为导入的CSV数据命名变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15767065/

10-11 03:06
查看更多