在Python 2.7.11中将列表保存并加载为csv文件

时间:2016-12-12 02:27:22

标签: python-2.7 file csv save load

我是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”传递的对象,我不知道为什么。

1 个答案:

答案 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}]]

感谢您提出完整的问题,如果出现问题或解释不充分,请与我联系。