2016-12-12 53 views
1

我是python新手。我有一个叫做bank的列表,可以是这样的:在Python 2.7.11中保存并加载列表为csv文件

bank = [["matt", "passw", 500, {apple:3}], ["luke", "passw123", 800, {google:2}]]

第一个参数:名称(string

第二参数:密码(string

第3个参数:现金金额(float

第四个参数:字典(动态,我可以改变键和值与其他功能)(我不知道如何保存它,如果你能告诉我该怎么做,我很感激它,我在代码上评论它)。

开始时,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和dictionary。另外,当我第二次尝试调用savedata(bank)时,它不起作用(它说当作第三个参数需要float而不是字符串)。我该如何解决它?先谢谢你。

最后一件事:savedata(bank)函数创建一个名为none的对象,除了用“st”传递的对象之外,我不知道为什么。

回答

0

我建议写bank出一个pickle文件,它是一个二进制格式,是不是人类可读的,但很容易让蟒蛇,而不必担心应该是什么string又该在读回是一个int等。有很多文件,如果你谷歌蟒蛇酱。

为了让人们可以读取它,您还可以将它保存为CSV文件,并将其保存为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}]] 

谢谢你的问题的完整,让我知道什么是错的或解释不清。

+0

这完全工作,你解释完美! – kdpkke