2017-02-12 136 views
1

我想保存一个字典的列表作为JSON文件。该列表包含需要转换的日期时间对象,因此我将该列表传递给json_data变量,将日期时间更改为字符串,然后将其保存。复制一个属性到一个变量,属性被改变

这里是我的代码添加新的字典条目,并将其保存:

TODAY = datetime.date.today() 

    class Deck(): 

     def __init__(self): 
      self.cards = [] 

     def add(self, question, answer): 
      '''Create a new card''' 
      card = { 
       'question': question, 
       'answer': answer, 
       'date_added': TODAY, 
       'review_date': TODAY, 
       } 
      self.cards.append(card) 

     def save(self): 
      '''Save cards''' 
      json_data = [] 
      for card in self.cards: 
       json_data.append(card) 

      for data in json_data: 
       data['date_added'] = data['date_added'].isoformat() 
       data['review_date'] = data['review_date'].isoformat() 

      with open('cards.json', 'w') as obj: 
       json.dump(json_data, obj) 

的文件保存好了,但由于某种原因self.cards是得到改变,而不是json_data。我希望self.cards中的日期时间对象保持这种状态。说的实例称为deck

>>> deck.add('1 + 1',2) 
>>> deck.cards[0]['date_added'] 
datetime.date(2017, 2, 12) 
>>> deck.save() 
>>> deck.cards[0]['date_added'] 
'2017-02-12' 
>>> deck.save() 

Traceback (most recent call last): 
data['date_added'] = data['date_added'].isoformat() 
AttributeError: 'str' object has no attribute 'isoformat' 

不知道为什么发生这种情况,我做了几个搜索,但没有找到一个解决方案。我很感激任何帮助。

+0

错误不匹配的标题 –

回答

1

当您保存您的数据时,您需要制作每张卡片的副本。否则,当您转换日期时,您仍然会修改原始卡片。

那么试试这个来代替:

def save(self): 
     '''Save cards''' 
     json_data = [] 
     for card in self.cards: 
      card = card.copy() 
      card['date_added'] = card['date_added'].isoformat() 
      card['review_date'] = card['review_date'].isoformat() 
      json_data.append(card) 

     with open('cards.json', 'w') as obj: 
      json.dump(json_data, obj)