我是python的新手。我有一个名为bank
的列表,可以是这样的:
bank = [["matt", "passw", 500, {apple:3}], ["luke", "passw123", 800, {google:2}]]
第一个参数:名称(string
)
第二个参数:密码(string
)
第3个参数:现金金额(float
)
第4个参数:字典(动态,我可以用其他功能更改键和值)(我不知道如何保存它,如果你能告诉我怎么做的话我很感激,我在代码上评论它)。
开始时,bank
是一个空白列表,并且有一个名为add_account
的函数,它会为参数添加一个新列表。我的目标是创建一个.csv文件,在其中保存bank
,如果我关闭程序,当我重新打开它时,我想加载.csv文件,其中包含之前保存的bank
的所有信息。
这些是您需要知道的功能,以解决我将要告诉您的问题:
import csv
def loaddata():
f = open('bank.csv','r')
reader = csv.reader(f)
for row in reader:
bank.append(row)
f.close()
def savedata(bank):
f = open('bank.csv','a')
for account in bank:
print account
#4th parameter is wrong, i don't know how to save the dicionary
st = '%s,%s,%f,%s\n' % (account[0], account[1], account[2], account[3])
f.write(st)
f.close()
bank = []
try:
bank.append(loaddata())
except IOError:
print "creating bank"
def add_account(bank):
new=create_account()
bank.append(new)
def create_account():
new_account = [0,0,0,0]
new_account[0] = raw_input('name ')
new_account[1] = raw_input('psw ')
new_account[2] = input('balance ')
new_account[3] = {}
return new_account
问题是当我调用savedata(bank)
将其保存在文件中,然后我调用loaddata(bank)
来恢复以前的bank
数据时,bank
被保存为单个字符串,所以我不能使用例如第3和第4个参数,因为它们被视为字符串而不是float和字典。此外,当我第二次尝试调用savedata(bank)
时,它不起作用(当然,它表示第三个参数需要浮点而不是字符串)。我该如何解决?先感谢您。
最后一件事:savedata(bank)
函数创建一个名为none
的对象,而不是用“st”传递的对象,我不知道为什么。
答案 0 :(得分:0)
我建议将bank
写入pickle
文件,这是一种非人类可读的二进制格式,但python很容易读回来,而不必担心什么应该是string
,应该是int
等等。如果你是google python pickle,那里有很多文档。
为了让人们可以阅读它,你也可以将bank
保存为csv文件,当你把它保存为泡菜时,你可以检查你实际保存的内容。
import pickle
import csv
def save_bank(bank, f_stem):
"""
Function to save out the bank
Pass in the bank and a file stem 'f_stem' like 'bank1'
This function will then save a 'bank1.csv' and a 'bank1.pickle'
"""
#Save out a csv of the bank so it's human readable
with open(f_stem+".csv", "wb") as out_csv:
csv_out = csv.writer(out_csv, bank)
csv_out.writerow(['Name','password','money','misc']) #Write out a header
for account in bank:
csv_out.writerow(account) #Write out each account as a row
#Save out a pickle of the bank so it's python readable
pickle.dump(bank, open(f_stem+".pickle", "wb"))
def load_bank(f_stem):
"""
Function to load in the bank
Only needs the file stem used to save out the bank, i.e. 'bank1'
"""
bank = pickle.load(open(f_stem+".pickle", "rb"))
return bank
#Make a test bank
test_bank = [["matt", "passw", 500, {"apple":3}],
["luke", "passw123", 800, {"google":2}]]
f_stem = "bank1"
save_bank(test_bank, f_stem) #Save out the test_bank
new_bank = load_bank(f_stem) #Read it back in as a new bank
#See if the read out and in are identical
print "Bank written and read correctly:", test_bank == new_bank
#Print out the new bank read back in
print new_bank
输出:
Bank written and read correctly: True
[['matt', 'passw', 500, {'apple': 3}], ['luke', 'passw123', 800, {'google': 2}]]
感谢您提出完整的问题,如果出现问题或解释不充分,请与我联系。