2017-09-02 177 views
1

我有一個小程序來跟蹤每月餘額。這工作得很好,然後我在該部分中添加以寫入底部的.txt文件。我做了一些搜索,但找不到一種方法來使其工作。基本上我想繼續追加到這個test.txt文件。每次我輸入一個新的月份/帳戶/餘額時,我都會將其附加到文件中。將字典輸出寫入文件 - Python

另一種方法是在'exit'之後附加到test.txt文件,所以它不會在每個循環中執行它。不知道哪種方式更有效

***編輯****

這個更新代碼現在創建test.txt文件,但該文件是每個循環

次要問題後的空白 - 我聽說這對於使用Class來說會更好,但我沒有任何想法。如果有人想證明那真的太棒了。這不是家庭作業,這是我自己的時間嚴格學習。

任何想法?由於

# 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

' 「W」'覆蓋文件 - 見https://stackoverflow.com/questions/4706499/how-do-you-append對一個文件 –

+0

@IzaakvanDongen。啊,是的,謝謝,應該是'一個'。這並不能解決問題。仍在print_accounts()中拋出a: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") 

一些解釋:該Account類有3個領域:iddatebalance。這些字段在構造函數中定義(__init__())。該類還有一個方法getString(),我用它來獲取每個實例的字符串表示

總體而言,已經做了以下修改:

  • 創建一個帳戶類,它作爲模板保持各賬戶的數據對象。
  • 使用循環打印帳戶並將它們寫入文件。
  • date轉成小寫,然後檢查它是否等於「退出」。這是一個小變化,但是有一個好習慣。
  • 刪除f.close(),因爲在使用with open()語句時沒有必要。
  • 創建Account的每個實例的自定義字符串表示形式,與您將以其他方式獲得的內容一致。

最後一個是通過在帳戶類中定義getString方法實現的。沒有什麼特別的,它只是我們用來獲得字符串表示的東西。

一種更好但更先進的方法是通過覆蓋基礎對象的__str____repr__方法。這些本質上是每個類都有的隱藏函數,但是python爲我們定義的函數。這兩個特定目的的目的是給出對象的字符串表示。對他們來說,默認的代碼不會產生任何有意義:

<__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)) 

此止跌」之前工作過,因爲str()會給我們你之前看到的亂碼數據。但是,現在我們已經重寫了方法,它工作得很好。

+0

非常感謝您花時間寫出來並向我解釋這一點。對我來說很有參考價值 – JD2775