我有一个跟踪月度余额的小程序。这样工作正常,然后我在部分中添加了写入底部的.txt文件。我做了一些搜索,但无法找到一种方法使其工作。基本上我想继续附加到这个test.txt文件。每次我输入新月/帐户/余额时,我都希望将其附加到文件中。
另一种方法是在'exit'之后附加到test.txt文件,因此它不会在每个循环中都这样做。不确定哪种方式更有效
*** **** EDIT
此更新的代码现在创建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()
答案 0 :(得分: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个字段:id
,date
和balance
。这些字段在构造函数(__init__()
)中定义。该类还有一个方法getString()
,我用它来获取每个实例的字符串表示。
总而言之,已经进行了以下更改:
date
变为小写。这是一个小小的改变,但却是一个好习惯。f.close()
,因为在使用with open()
语句时没有必要。Account
的每个实例创建一个自定义字符串表示形式,与您原本获得的一致。通过在帐户类中定义getString
方法来实现最后一个。它没有什么特别之处,它只是我们用来获取字符串表示的东西。
通过覆盖基础对象的__str__
和__repr__
方法,一种更好但更先进的方法是实现这一目标。这些本质上是每个类都有的隐藏函数,但是python为我们定义了这些函数。这两个特定的目的是给出对象的字符串表示。它们的默认代码不会产生任何有意义的内容:
<__main__.Account object at 0x0000000003D79A58>
但是,通过覆盖它们,我们可以在str()
的实例上使用Account
,我们将以我们想要的确切格式获得字符串表示。修改后的类看起来像这样:
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()
会给我们你之前看到的乱码数据。但是,现在我们已经覆盖了这些方法,它的工作正常。
答案 1 :(得分: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()