【问题标题】:The difference between `str` and `pickle` serialization methods for dictionary values字典值的`str`和`pickle`序列化方法的区别
【发布时间】:2014-07-18 08:59:00
【问题描述】:

如果我想将 Dictionary 结构保存到文件中,然后直接从文件中读取此 Dictionary,我有两种方法,但我不知道这两种方法之间的区别。谁能解释一下? 这是一个简单的例子。假设这是我的字典:

D = {'zzz':123,
     'lzh':321,
     'cyl':333}

第一种保存到文件的方法:

with open('tDF.txt','w') as f: # save
   f.write(str(D) + '\n')
with open('tDf.txt','r') as f:
   Data = f.read() # read. Data is string
Data = eval(Data) # convert to Dictionary structure format

第二种方法(使用pickle):

import pickle
with open('tDF.txt','w') as f: # save
   pickle.dump(D,f)
with open('tDF.txt','r') as f:
   D = pickle.load(f) # D is Dictionary structure format

我认为第一种方法很简单。有什么区别?

谢谢!

【问题讨论】:

    标签: python file dictionary pickle


    【解决方案1】:

    str值表示

    如果您将数据的str 值扭动,则您依赖于事实,即它的形状正确。

    在某些情况下(例如浮点数,还有更复杂的对象),您会丢失一些精度或信息。

    使用repr 而不是str 可能会稍微改善这种情况,因为repr 应该以某种形式提供文本,这样在读回时可能会起作用(但没有任何保证)

    写入pickled 数据

    Pickle 关心每一点,因此您将获得序列化的精确信息。

    这是相当显着的差异。

    使用其他序列化方法

    就个人而言,我更喜欢序列化为json 或有时yaml,因为这种形式的数据可读性好、可移植,甚至可以编辑。

    序列化为 JSON

    对于 json,它是这样工作的:

    import json
    data = {"a", "aha", "b": "bebe", age: 123, num: 3.1415}
    with open("data.json", "w") as f:
        json.dump(data, f)
    
    
    with open("data.json", "r") as f:
        readdata = json.load(data, f)
    
    print readdata
    

    序列化为 YAML

    使用 YAML:

    首先确定,你已经安装了一些 YAML 库,例如:

    $ pip install pyyaml
    

    就我个人而言,我一直都安装它,因为我经常使用它。

    那么,那么脚本只改变了一点:

    import yaml
    data = {"a", "aha", "b": "bebe", age: 123, num: 3.1415}
    with open("data.yaml", "w") as f:
        yaml.dump(data, f)
    
    
    with open("data.yaml", "r") as f:
        readdata = yaml.load(data, f)
    
    print readdata
    

    结论

    对于相当简单的数据类型,上述方法很容易工作。

    如果您开始使用已定义的类的实例,则需要正确定义 给定格式的加载器和序列化器。描述这一点超出了这个问题的范围,但它 在存在某种解决方案的所有情况下绝对是可能的(因为存在一些类型的值,其中 无法可靠地序列化,例如文件指针、数据库连接等)

    【讨论】:

    • 感谢您的回答。我想这是我想知道的。
    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多