2017-02-12 7 views
1

辞書のリストをJSONファイルとして保存しようとしています。リストには変換が必要なdatetimeオブジェクトがあるので、リストをjson_data変数に渡し、datetimeを文字列に変更して代わりに保存します。ここで変数を属性にコピーすると、属性が代わりに変更される

は、新しい辞書エントリを追加し、それを保存するために私のコードです:

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のdatetimeオブジェクトをそのままにしておきたい。インスタンスが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) 
関連する問題