python - `str` 和 `pickle` 字典值序列化方法的区别

标签 python file dictionary pickle

如果我想将一个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

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

谢谢!

最佳答案

编写str值表示

如果您写入数据的 str 值,您就可以相信它的形状正确。

在某些情况下(例如 float ,但也包括更复杂的对象),您会丢失一些精度或信息。

使用 repr 而不是 str 可能会稍微改善情况,因为 repr 应该以表单形式提供文本,即在读回它的情况下可能会起作用(但没有任何保证)

写入pickle数据

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

结论

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

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

关于python - `str` 和 `pickle` 字典值序列化方法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24821054/

相关文章:

c# - 解析日志文件并获取条目数据

java - 什么是 Swift 字典的 Android Java 等价物?

python - 修改字典

python - 带有文本和图标项的 QListWidget

python - 如何为 matplotlib 中的圆圈分配颜色?

python - 如何可视化 Pandas 中的缺失值模式

c++ - 遍历标准映射并比较文本

python - 如何在x轴上显示所有日期值?

python - 在文本文件中查找值

file - 有没有办法设置 <input type ='file'/> 的宽度以在 Firefox 中显示?