字典值的'str'和'pickle'序列化方法之间的区别

2024-06-28 19:40:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

第二种方法(用泡菜):

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

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

谢谢!你知道吗


Tags: 文件方法txtreaddatadictionary字典is
1条回答
网友
1楼 · 发布于 2024-06-28 19:40:40

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

结论

对于相当简单的数据类型,上面描述的方法很容易工作。你知道吗

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

相关问题 更多 >