2016-07-11 7 views
0

私は、オブジェクトのインベントリを作成するPython 3.5プログラムを持っています。 Trampoline(色、サイズ、春など)のクラスを作成しました。私は常にクラスの新しいインスタンスを作成し、次にそれらの辞書を保存します。辞書は次のようになります。オブジェクトの辞書を保存するには?

my_dict = {name: instance} and the types are like so {"string": "object"} 

私の問題は、私は私がプログラムを閉じ前回中断したところ私が開始できるように、このインベントリリストを保存する方法を知りたいということです。

私はpickleを使用したくないのですが、私は今後より重要なバージョンでこれを行うための安全な方法を学んでいるからです。

私はsqlite3を使用することを考えました。これを簡単に行う方法についてのヒントがあれば分かります。

私の好みの解決策は、jsonモジュールを使用してそれを行う方法を述べます。私はそれを試してみましたが、私が得たエラー:

__main__.Trampoline object at 0x00032432... is not JSON serializable 

編集:編集

out_file = open(input("What do you want to save it as? "), "w") 
json.dump(my_dict, out_file, indent=4) 
out_file.close() 

終了:以下

私はエラーを得たときに私が使用したコードがあります

私はかなりの量の研究を行っており、これらの多くにも問題があることがわかりました。オプションを保存することができるのはです。オブジェクトは 'ファイルを保存'していますが、これを回避するには、作成したオブジェクトなどの辞書を使用することです。これを明確にする情報も素晴らしいでしょう!

+0

jsonを使用するには、独自のjsonシリアライザ(ハードではない)を作成するか、json以外のオブジェクトを最初に文字列にする必要があります。たとえば、datetimeオブジェクトをどのくらい正確に保存したいのですか? – cmd

+0

わかりました。私は研究しているときに何かを見ていましたが、あまり理解していませんでした。最初に文字列にすると、プログラムを再起動したときでも同じ機能を果たしますか、何らかの形でオブジェクトに変換しますか?また、まだdatetimeを使用する予定はありません。おそらく近い将来です。 – AmericanMade

+0

'https:// docs.python.org/2.7/library/json.html#encoders-and-decoders' – cmd

答えて

1

ここではDateTimeオブジェクトを処理するクラスの例です。

class CustomEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, datetime.datetime): 
      if obj.tzinfo: 
       obj = obj.astimezone(isodate.tzinfo.UTC).replace(tzinfo=None) 
      return obj.isoformat()[:23] + 'Z' 
     return json.JSONEncoder.default(self, obj) 

あなたがclsdefault機能を使用すると、渡されたオブジェクトと呼ばれるJSONにエンコードします。 json.JSONEncoder.default標準の一部ではないタイプを処理したい場合は、それをインターセプトして、有効なjsonタイプとしてどのように処理するかを返す必要があります。この例ではdatetimestrに変換して返しました。私が特別なケースにしたいタイプのものでなければ、標準のjson.JSONEncoder.defaultハンドラに渡します。

あなたがjson.dumpまたはjson.dumpsclsのparamでそれを渡す必要があり、このクラスを使用するには:

json.dumps(obj, cls=CustomEncoder) 

デコードも同じように行われますがjson.JSONDecoderjson.load、およびjson.loadsとされます。ただし、タイプの一致ができないため、デコードのためのエンコードに「ヒント」を追加するか、デコードする必要があるタイプを知る必要があります。

+0

パーフェクト!私はそれがまさに私が必要とするものだと思います!ありがとう! – AmericanMade

+0

.dumpsを使用する必要がありますか、または.dumpを使用できますか? – AmericanMade

+0

'json.dumps()'と 'json.dump()'はどちらも 'cls'パラメータで動作します。 – cmd

0

シンプルなクラスでは、以下のような簡単なシリアライザを作成できます。これにより、Trampolineオブジェクトのすべてのプロパティが取得され、辞書に入れられてJSONに入れられます。あなたが行うことができるかもしれない何

class Trampoline(object): 
    ... 
    def serialize(self): 
     return json.dumps(vars(self)) 

あなたのクラスはもう少し複雑である場合には、より複雑なシリアライザを書く:)

1

は、CSVファイルにインスタンスの属性を保存して、それを作成しています起動時にこれはコードが多すぎる可能性があり、最良の方法ではありません。明らかな問題の1つは、パラメーターと同じ量の属性を持たないと機能しないということです。これは必要に応じて修正する必要があると私は信じています。私はちょうど私が試してみて、ポスト、それが助けかどうかもしれないと思った:)

import json 


class Trampoline: 
    def __init__(self, color, size, height, spring): 
     self.color = color 
     self.size = size 
     self.height = height 
     self.spring = spring 

    def __repr__(self): 
     return "Attributes: {}, {}, {}, {}".format(self.color, self.size, self.height, self.spring) 


my_dict = { 
    "name1": Trampoline('red', 100, 2.3, True), 
    "name2": Trampoline('blue', 50, 2.1, False), 
    "name3": Trampoline('green', 25, 1.8, True), 
    "name5": Trampoline('white', 10, 2.6, False), 
    "name6": Trampoline('black', 0, 1.4, True), 
    "name7": Trampoline('purple', -33, 3.0, True), 
    "name8": Trampoline('orange', -999, 2.5, False), 
} 


def save(my_dict): 
    with open('save_file.txt', 'w') as file: 
     temp = {} 
     for name, instance in my_dict.items(): 
      attributes = {} 
      for attribute_name, attribute_value in instance.__dict__.items(): 
       attributes[attribute_name] = attribute_value 
      temp[name] = attributes 
     json.dump(temp, file) 


def load(): 
    with open('save_file.txt', 'r') as file: 
     my_dict = {} 
     x = json.load(file) 
     for name, attributes in x.items(): 
      my_dict[name] = Trampoline(**attributes) 
    return my_dict 


# CHECK IF IT WORKS! 
save(my_dict) 
my_dict = load() 
print("\n".join(["{} | {}".format(name, instance) for name, instance in sorted(my_dict.items())])) 
+0

これは良い解決策のようです。今はちょっと違うことをやっていますが、これを試してみるかもしれません。ありがとう! – AmericanMade

関連する問題