2017-09-02 43 views
1

私は毎月の残高を追跡する小さなプログラムを持っています。これはそのままで正常に動作し、その後、セクションの下に.txtファイルに書き込むように追加しました。私はいくつかの検索をしましたが、それを動作させる方法を理解することはできません。基本的には、このtest.txtファイルに続けて追加したいと思います。新しい月/口座/天びんを入力するたびに、それをファイルに追加します。辞書出力をファイルに書き込む - Python

代わりに、 'exit'の後にtest.txtファイルを追加することで、すべてのループを終了させることはありません。より効率的な

でどの方法がわからない*** EDIT ****

セカンダリの質問に、この更新されたコードは、今test.txtというファイルを作成しますが、ファイルは、各ループの後に空白である - 私は聞いたことがありますこのためにクラスを使う方が良いでしょうが、どのように見えるか分かりません。誰かがそれが素晴らしいとデモンストレーションしたい場合。これは宿題ではなく、これは自分の時間で厳密に学習しています。

アイデア?あなたの元のコードと感謝

# create program to track monthly account balances 

savings = [] 

def add_accounts(date, account, balance): 

    savings.append({'date': date, 'account': account, 'balance': 
balance}) 

def print_accounts(): 
    print(savings) 

while True: 

    date = input('Enter the date, type exit to exit program: ') 
    if date == 'exit': 
     break 
    account = input('Enter the account: ') 
    balance = int(input('Enter the balance: ')) 

    add_accounts(date, account, balance) 
    print_accounts() 
with open('test.txt', 'a') as f: 
for row in savings(): 
    print (row) 
    f.write(str(savings[-1])) 
    file.close() 
+1

''ファイルを上書きし、 "ワット" - https://stackoverflow.com/questions/4706499/how-do-you-appendを参照してください-to-a-file –

+0

@ IzaakvanDongen。ああ、ありがとう、 'a'にする必要があります。しかしそれは問題を解決しません。 print_accounts()の行のfor:をまだスロー: TypeError: 'NoneType'オブジェクトは反復不可能です。エラー – JD2775

+0

エラーのトレースバックをコピーしてください。 –

答えて

1

このコード(使用-1終了する)を試してみてください。

savings = [] 

def add_accounts(date, account, balance): 

    savings.append({'date': date, 'account': account, 'balance': 
balance}) 

def print_accounts(): 
    print(savings) 

while True: 

    date = input('Enter the date, type exit to exit program: ') 
    if date == -1: 
     break 
    account = input('Enter the account: ') 
    balance = int(input('Enter the balance: ')) 

    add_accounts(date, account, balance) 
    print_accounts() 
with open('test.txt', 'a') as f: 
    for row in savings: 
     print (row) 
     f.write(str(savings[-1])) 
     f.close() 
+0

@ jd2775これは機能しますか?まだ問題が残っていますか? –

+0

は素晴らしい作品です、ありがとうございます! – JD2775

+0

時間を取ったときに私にここに示したコードを実行してもらえますか?私はまだ実行時に空の出力テキストファイルを取得します。ちょうど今それに気づく。あなたが同じ結果を得たら興味があります。ありがとう - – JD2775

2

問題はprint_accounts()は何も返さない、まだあなたはその(存在しない)戻り値に対して操作を実行しようとしていることです。

class Account: 
    def __init__(self, id, date, balance): 
     self.id = id 
     self.date = date 
     self.balance = balance 

    def getString(self): 
     return self.id + "," + self.date + "," + str(self.balance) 

savings = [] 

def add_account(date, account, balance): 
    savings.append(Account(date, account, balance)) 

def print_accounts(): 
    for account in savings: 
     print(account.getString()) 

while True: 
    date = input("Enter the date, type exit to exit program: ") 
    if date.lower() == "exit": 
     break 
    else: 
     account = input('Enter the account: ') 
     balance = int(input('Enter the balance: ')) 
     add_account(date, account, balance) 
     print_accounts() 
     with open("test.txt", "w") as file: 
      for account in savings: 
       file.write(account.getString() + "\n") 

クラスに関するいくつかの説明を::iddate、およびbalanceAccountクラスには、3つのフィールドを持っている。ここ

は、あなたのプログラムのバージョンは、クラスを使用して、いくつかの修正で作られています。これらのフィールドは、コンストラクタ(__init__())で定義されています。クラスにはメソッドgetString()があり、これを使用して各インスタンスのの文字列表現を取得します。すべてのオーバー

、以下の変更が行われています

  • は、各アカウントのデータを保持するオブジェクトのテンプレートとして機能Accountクラスを作成します。
  • アカウントを印刷してファイルに書き込むには、ループを使用します。
  • dateを小文字にして、exitと等しいかどうかを確認してください。これは小さな変化ですが、良い習慣です。
  • with open()ステートメントを使用する場合は不要ですので、削除されたのはf.close()です。
  • 各インスタンスのカスタム文字列表現をAccountとして作成します。

最後のものは、アカウントクラスでgetStringメソッドを定義することによって達成されます。特別なことは何もありません。単にストリング表現を得るために使用するものです。

基本オブジェクトの__str____repr__のメソッドをオーバーライドすることで、これを実現するためには、はるかに高度な方法があります。これらは基本的にすべてのクラスが持つ隠し関数ですが、Pythonが定義しています。これら2つの特定の目的は、オブジェクトの文字列表現を与えることです。

<__main__.Account object at 0x0000000003D79A58> 

しかし、それらをオーバーライドすることによって、我々はAccountのインスタンスにstr()を使用することができ、私たちは私たちが望むの正確な形式の文字列表現を取得します:それらのデフォルトのコードは、意味のある何かを生成しません。変更されたクラスは、そのようになります。

class Account: 
    def __init__(self, id, date, balance): 
     self.id = id 
     self.date = date 
     self.balance = balance 

    def __repr__(self): 
     return self.id + "," + self.date + "," + str(self.balance) 
    def __str__(self): 
     return self.__repr__() 
ファイルへの書き込み時にこれもsavingsをループする必要がなくなり

with open("test.txt", "w") as file: 
    for account in savings: 
     file.write(account.getString() + "\n") 

が変身:

with open("test.txt", "w") as file: 
    file.write(str(savings)) 

このwouldn」前に見たばかげたデータをstr()が与えてくれたので、以前はうまくいきました。しかし、メソッドをオーバーライドしたので、うまく動作します。

+0

これを書いてこれを私に説明する時間をとってくれてありがとう。私のための大きい参照 – JD2775

関連する問題