How do I serialize a Python dictionary into a string, and then back to a dictionary?

前端 未结 8 1058
我在风中等你
我在风中等你 2020-11-29 20:46

How do I serialize a Python dictionary into a string, and then back to a dictionary? The dictionary will have lists and other dictionaries inside it.

8条回答
  •  天涯浪人
    2020-11-29 21:32

    Pickle is great but I think it's worth mentioning literal_eval from the ast module for an even lighter weight solution if you're only serializing basic python types. It's basically a "safe" version of the notorious eval function that only allows evaluation of basic python types as opposed to any valid python code.

    Example:

    >>> d = {}
    >>> d[0] = range(10)
    >>> d['1'] = {}
    >>> d['1'][0] = range(10)
    >>> d['1'][1] = 'hello'
    >>> data_string = str(d)
    >>> print data_string
    {0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], '1': {0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 1: 'hello'}}
    
    >>> from ast import literal_eval
    >>> d == literal_eval(data_string)
    True
    

    One benefit is that the serialized data is just python code, so it's very human friendly. Compare it to what you would get with pickle.dumps:

    >>> import pickle
    >>> print pickle.dumps(d)
    (dp0
    I0
    (lp1
    I0
    aI1
    aI2
    aI3
    aI4
    aI5
    aI6
    aI7
    aI8
    aI9
    asS'1'
    p2
    (dp3
    I0
    (lp4
    I0
    aI1
    aI2
    aI3
    aI4
    aI5
    aI6
    aI7
    aI8
    aI9
    asI1
    S'hello'
    p5
    ss.
    

    The downside is that as soon as the the data includes a type that is not supported by literal_ast you'll have to transition to something else like pickling.

提交回复
热议问题