有没有一个类似Python pickle的库,可以输出ASCII而不是二进制流?

6
pickle的输出是非人类可读的,因此无法编辑。
我正在寻找与pickle完全相同(或非常接近)的东西,它可以将所有可理解的python对象转储到文件中,并且以后可以直接加载它。

3
“pickle(腌制)”本身已经非常值得怀疑,而人工编辑“pickle”数据的想法让我想要逃离。这些数据是什么,为什么你想要进行“pickle”和编辑呢? - Eevee
另一方面,pickle可以转储ASCII流(当然仍然不可编辑)。 - wRAR
1
你不会编辑一个腌菜。Python源代码已经可读且可编辑。为什么不使用源代码呢? - Keith
不一定需要使用pickle。我实际上正在寻找的是一种能够转储Python对象并在以后将所有配置加载到Python中的解决方案。有没有其他方法可以解决这个问题? - lionel319
我认为更好的标题应该是“是否有一个像pickle一样强大的Python库,但其导出的文件可读且可编辑?” 我不认为它应该是pickle的某个版本,也似乎@lionel319真正需要的是ASCII而不是例如UTF-8,而只是非二进制输出。(还要记住:没有所谓的纯文本。) - brandizzi
3个回答

5

不需要再寻找,选择 json。json是一种文本格式,易于编辑。它可以直接将Python内置类型(如列表、字典、字符串等)的对象序列化,同时也有方法可以将自己定义的类对象序列化成json格式,详见这里:如何使一个类具备JSON可序列化能力


根据RFC 4627,“JSON文本应该使用Unicode编码。默认编码为UTF-8。”因此它不是ASCII码。 - Keith
2
然而,JSON只序列化数据,而不是对象。例如,您无法获取类实例。 - Keith
@Eevee 但是规范说明它是UTF-8,所以你应该期望将其解码为UTF-8。 - Keith
或者YAML。它不像JSON那么流行,但感觉更符合Python的风格(也许如果它被命名为JAML,它会像JSON一样被广泛使用和滥用)。 - Travis Griggs
@brandizzi 我认为可以通过自定义JSONEncoder和Decoder来完成。您需要引入一种表示对象身份和对已序列化对象的引用的方式,以处理循环。 - piokuc
显示剩余6条评论

3

将对象转储到文件

import pprint
f = open('a.txt', 'w')
pprint.pprint(myobject, f)
f.close()

从文件中加载对象

import pprint
f = open('a.txt')
lines = f.read()
myobject = eval(lines)
f.close()

1
如果你想要pickle的所有灵活性,我会建议你创建一个特定的格式来帮助你。我不知道有任何工具可以像pickle一样强大,同时生成可编辑的导出数据,但你可以创建自己的工具。一段时间以前,我创建了一个玩具模块,它可以包装一个Python模块,使其能够发送和接收XML消息,主要是为了向朋友展示如何轻松使用Python :) 它并不完全符合你的要求,但可以作为一个起点,所以看一下吧。(顺便说一句,我很乐意知道其他做同样事情的更好的工具。我相信这样的工具应该存在,只是我还没有找到。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接