0

次のコードがあります。

>>> word_array = defaultdict(list)
>>> word_array['first'].append(1)
>>> word_array['first'].append(2)
>>> word_array
defaultdict(<type 'list'>, {'first': [1, 2]})

データ構造全体を文字列に変換しましたが、文字列から変換しようとすると、次のようになります。

>>> ast.literal_eval(str(word_array))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/lib/python2.7/ast.py", line 37, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    defaultdict(<type 'list'>, {'first': [1, 2]})
                ^
SyntaxError: invalid syntax

これに対するより良い解決策はありますか。

4

4 に答える 4

1

ここでやりたいことは、データ構造を文字列にシリアライズしてから、デシリアライズしてデータ構造に戻すことだけです。ast.literal_eval生産のようなものを使用しないでください。使用するだけpickleです:

import pickle
from collections import defaultdict

word_array = defaultdict(list)
word_array['first'].append(1)
word_array['first'].append(2)

s = pickle.dumps(word_array)
other = pickle.loads(s)

print other

与えます:

defaultdict(<type 'list'>, {'first': [1, 2]})
于 2012-05-21T09:30:50.707 に答える
1

defaultdictオン デコードにすることを気にしない場合は、を使用しますjson。気にする場合json、 も使用しますが、オブジェクトのデコードで使用する関数を 経由で渡しますobject_hook

>>> d = collections.defaultdict(list)
>>> d['first'] = [1, 2]
>>> json.dumps(d)
'{"first": [1, 2]}'
>>> json.loads('{"first": [1, 2]}')
{u'first': [1, 2]}
>>> def ddoh(d):
...   res = collections.defaultdict(list)
...   res.update(d)
...   return res
... 
>>> json.loads('{"first": [1, 2]}', object_hook=ddoh)
defaultdict(<type 'list'>, {u'first': [1, 2]})
于 2012-05-21T09:32:25.397 に答える
1

オブジェクトをシリアライズ/デシリアライズしますか? もしそうなら、Pickle python モジュールはあなたのために作られています。

于 2012-05-21T09:33:54.470 に答える