2016-12-12 9 views
1

私はPythonを初めて使いました。Python 2.7.11でcsvファイルとしてリストを保存してロードする

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

第一パラメータ:名前(string

第二パラメータ:パスワード(string

は、3番目のパラメータ:現金私はこのようなものになることができbankと呼ばれるリストを持っています量(float

第4パラメータ:辞書(動的、私は他の機能とキーと値を変更することができます)(私はしないそれを保存する方法を知っている、あなたが私にそれを行う方法を教えていただけたら、私はそれを感謝し、私はコードにコメントした)。

bankは空白のリストで、add_accountという名前の関数では、パラメータとして新しいリストを追加します。私の目標は.csvファイルを作成し、その中にbankを保存し、プログラムを終了すると、前回保存したbankのすべての情報を.csvファイルにロードしたいと思っています。 は、これらはあなたが私はあなたを伝えることについてだ問題を解決するために知っておく必要がある関数である:

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は1つの文字列として保存されていました。たとえば、3番目と4番目のパラメータは文字列として表示され、floatやdictionaryではなく、使用できません。また、私がsavedata(bank)を2回目に呼び出そうとすると、それは動作しません(3番目のパラメータが文字列の代わりに浮動小数点数を要求するため)。どうすれば解決できますか?前もって感謝します。

最後のもの:savedata(bank)関数は、 "st"で渡されたもの以外のnoneというオブジェクトを作成します。理由はわかりません。

答えて

0

私が読める人間ではありませんバイナリ形式でpickleファイルへ出bankを書くことをお勧めしますが、string、何べきどうあるべきかを心配することなくバックで読むためのpythonのための非常に簡単であるだろう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}]] 

何かが間違っているか、不十分で説明なら、私に知らせて、完全な質問をありがとうございます。

+0

これは完全に機能し、完全に説明しました。 – kdpkke

関連する問題