【问题标题】:KeyError: 'returnedbooks' when creating a new json file in pythonKeyError:在python中创建新的json文件时出现'returnedbooks'
【发布时间】:2021-10-29 11:17:13
【问题描述】:

所以我创建了一个 ReturnedBook 类并希望记录一本被退回的书,这需要记录在 json 文件中(这个文件目前不存在,所以它需要创建然后在事后追加)

这是我的类和函数

returnedbooksJsonPath = 'returnedbooks.json'

    class ReturnedBook(BookItem):
      def __init__(self, book_id, returned_date):
        self.__book_id = book_id
        self.__returned_date = returned_date
    
      def get_returned_date(self):
        return self.__returned_date
    
      def get_book_id(self):
        return self.__book_id
    
      def record_returned_book(self):
        with open(returnedbooksJsonPath, 'a+') as returnedbooks:
          data['returnedbooks'].append({
            'book_id': self.__book_id,
            'returned_date': self.__returned_date,
          })
          json.dump(data, returnedbooks, indent=4, default=str)
    
        return "You have successfully returned the book"
    
    
    r = ReturnedBook("32", datetime.now())
    r.record_returned_book()

当我运行这段代码时,我得到一个 KeyError: returnedbooks

KeyError: 'returnedbooks'
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_18420/88328772.py in <module>
     25 
     26 r = ReturnedBook("32", datetime.now())
---> 27 r.record_returned_book()

~\AppData\Local\Temp/ipykernel_18420/88328772.py in record_returned_book(self)
     15     with open(returnedbooksJsonPath, 'a+') as returnedbooks:
     16       header = [returnedbooks.readline().strip() for i in range(3)]
---> 17       data['returnedbooks'].append({
     18         'book_id': self.__book_id,
     19         'returned_date': self.__returned_date,

KeyError: 'returnedbooks'

我对 open 和使用 'a+' 的理解是,如果文件不存在,它会创建文件,然后附加数据?但是,查看此错误,它会创建文件,但由于文件为空白且文件中没有名为“returnedbooks”的列表/字典,因此没有写入任何内容?

请问我的功能哪里出错了?我需要事先创建一个名为returnbooks 的空列表吗?

提前致谢。

【问题讨论】:

  • data 指的是什么?
  • 啊...所以我正在尝试在文件中创建该数据,本质上该文件目前不存在,所以我正在尝试创建它,然后将其添加到
  • 不要使用以双下划线 __ 开头的类变量,这通常是不符合 Python 的。而是定义像book_id 这样的变量,然后像ret_book.book_id 那样访问它们,而不是为它创建一个方法。另一个常见的 Python 习惯用法是使用属性来返回内部属性,例如 _book_id,但除非您想更改 ex 返回的 id。基于一个条件,那么我认为在这种情况下最好只使用简单的属性。
  • 感谢您的评论,我正在通过我的大学学位学习这一点,双下划线以这种方式显示给我们,但现在很高兴知道。谢谢。 :-)

标签: python class methods


【解决方案1】:

感谢@rttr,我设法弄明白了这一点,他对此有所了解。因此,如果数据为空白,我创建了一个新列表,然后允许我创建文件,他们在此处附加数据是我的解决方案

returnedbooksJsonPath = 'returnedbooks.json'

class ReturnedBook(BookItem):
  def __init__(self, member_id, book_id, returned_date):
    self.__member_id = member_id
    self.__book_id = book_id
    self.__returned_date = returned_date

  def get_returned_date(self):
    return self.__returned_date

  def get_book_id(self):
    return self.__book_id
  
  def member_id(self):
    return self.__member_id

  def record_returned_book(self):
    with open(returnedbooksJsonPath, 'a+') as returnedbooks:
      data = returnedbooks.read()
      if data == '':
          data = {
            'returnedbooks': []
          }
          data['returnedbooks'].append({
          'member' : self.__member_id,
          'book_id': self.__book_id,
          'returned_date': self.__returned_date,
        })
      json.dump(data, returnedbooks, indent=4, default=str)

    return "You have successfully returned the book"


r = ReturnedBook("10", "32", datetime.now())
r.record_returned_book()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2022-01-24
    • 2021-08-02
    • 2018-02-25
    相关资源
    最近更新 更多