我是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/