将字典输出写入文件 - Python

时间:2017-09-02 22:23:47

标签: python dictionary file-io

我有一个跟踪月度余额的小程序。这样工作正常,然后我在部分中添加了写入底部的.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()

2 个答案:

答案 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个字段:iddatebalance。这些字段在构造函数(__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()