我正在与几个音乐播放器集成。目前,我最喜欢的是灵动的。

在新版本中,他们正在将数据库格式从SQLite3迁移到内部Pickle格式。我想知道是否有一种方法可以访问泡菜格式的文件,而不必手动对格式进行逆向工程。

我知道有cPickle python模块,但是我不知道它是否可以直接从C调用。

最佳答案

http://www.picklingtools.com/

有一个名为PicklingTools的库,该库可能会有用:我可以维护该库:它使您可以用C++形成数据结构,然后可以对其进行腌制/解开...这是C++,而不是C,但这不应该成为问题。这些天(假设您正在使用gcc / g++套件)。

该库是一个普通的C++库(发行版中有一些C++和Python的示例,显示了如何通过C++和Python的套接字和文件使用该库),但总的来说,可以使用对文件进行酸洗的基本知识。

基本思想是PicklingTools库为您提供了来自C++的“类似于python”的数据结构,以便您可以在Python / C++中进行序列化和反序列化。支持所有(?)基本类型:int,long int,字符串,None,复杂,字典,列表,有序字典和元组。做自定义类的钩子(Hook)很少,但是那部分还不成熟:该库的其余部分相当稳定,并且已经运行了8(?)年。

简单的例子:

#include "chooseser.h"
int main()
{
  Val a_dict = Tab("{ 'a':1, 'b':[1,2.2,'three'], 'c':None }");
  cout << a_dict["b"][0];  // value of 1

  // Dump to a file
  DumpValToFile(a_dict, "example.p0", SERIALIZE_P0);

  // .. from Python, can load the dictionary with pickle.load(file('example.p0'))

  // Get the result back
  Val result;
  LoadValFromFile(result, "example.p0", SERIALIZE_P0);
  cout << result << endl;
}

该网站上还有其他文档(FAQ和用户指南)。

希望这是有用的:

再见

里奇

http://www.picklingtools.com/

10-02 06:57
查看更多