在Python脚本中嵌入pickle(或任意)数据
在Perl语言中,当解释器遇到一行包含
__END__
的代码时,它会有点“停住”。这个特性通常用来在Perl脚本的末尾嵌入一些任意的数据。这样,Perl脚本就可以获取并存储它自己里面的数据,这样做可以带来很多不错的机会。
在我的情况下,我有一个被“腌制”的对象(就是一种保存数据的方式),我想把它存储到某个地方。虽然我可以使用一个文件,比如file.pickle,来存储这个对象,但我想找一种更紧凑的方法(这样可以更方便地分发脚本)。
有没有什么机制可以让我们在Python脚本里嵌入任意的数据呢?
4 个回答
2
在Python中,你可以使用"""(三重引号字符串)来在程序中嵌入长文本数据。
不过在你的情况下,别浪费时间在这个上面。
如果你有一个已经被“腌制”(pickled)的对象,实际上你会更开心的是把这个对象转储成Python源代码,然后直接把源代码包含进来。
使用repr
函数,对大多数对象来说,它会输出这个对象的Python源代码版本。如果你为所有自定义类实现了__repr__
方法,你就可以很简单地把你的结构转储成Python源代码。
另一方面,如果你的腌制结构最开始就是Python代码,那就直接保留它作为Python代码吧。
4
使用pickle,你也可以直接处理字符串。
s = pickle.dumps(obj)
pickle.loads(s)
如果把这个和"""(三重引号字符串)结合起来,你就可以很方便地把任何经过pickle处理的数据存储到文件里。
3
如果数据不是特别大(几千字节),我会直接用 .encode('base64') 把它编码成一种特殊的格式,然后放在一个三重引号的字符串里。要想把它变回原来的二进制数据,可以用 .decode('base64'),再用 pickle.loads() 来处理一下。