如何在python中存储嵌套数据?

时间:2015-07-28 02:34:27

标签: python json data-structures pickle

我将嵌套数据标记为“books”,如下所示,

book0 = {'authorId': u'4657987','bookId': u'3532901',
 'genre': u'horror','freeChapters': [[u'2015-07-03 15:14:25', u'3376'],
  [u'2015-07-03 17:52:39', u'2116'],...,[u'2015-07-26 20:08:11', u'2120'],
  [u'2015-07-27 20:12:12', u'2139']],'updateStatus': u'to be continued',
 'wordCount': u'56322'} 

book1 = {'authorId': u'3840480','bookId': u'3453158',
 'genre': u'romance','freeChapters': [[u'2015-04-07 18:58:15', u'317'],
  [u'2015-04-02 21:46:36', u'2103'],
  [u'2015-04-03 13:02:17', u'2416'], ...,
  [u'2015-07-24 00:07:43', u'2195']],'updateStatus': u'completed',
 'chargedChapters': [[u'2015-07-25 14:14:53', u'10'],
  [u'2015-07-26 00:07:46', u'11'],
  [u'2015-07-27 00:07:58', u'10'],
  [u'2015-07-28 00:07:52', u'10']],
 'wordCount': u'269059'}

...

我希望有大约200,000个这样的对象,每个对象都是从互联网上删除的。鉴于每本“书”都需要一些努力和时间,我想逐一保存。我不认为JSON允许我这样做,而且我目前正在使用泡菜。但是,以后我可能需要参考一本特定的书。我担心为了做到这一点,我必须一遍又一遍地开口。在我的情况下,存储这些对象的最佳方法是什么?

我最终选择了以行分隔的JSON。

3 个答案:

答案 0 :(得分:2)

政治上正确的答案是“它取决于”。也就是说,请使用JSON

Pickle是一种功能强大的格式,能够重建丰富数据类型的复杂对象。但是,它相对较慢,它会将您绑定到python,对于不受信任的数据并非100%安全。 它提供丰富的输入,但不提供速度,便携性或安全性。它也是不可读的

XML是一种旧格式,正在逐渐停止使用。它不直接映射到面向对象的设计。在大多数现代语言中阅读和写作XML既麻烦又冗长,并产生不安的抽象。 今天使用XML的理由很少

JSON是一种非常广泛采用的轻量级格式。它提供有限的数据类型(例如,缺少日期)。这意味着字符串化很多类型,但也意味着格式相对安全:不受信任的数据无法让您感到惊讶。它快速,高度便携且易于阅读。它几乎直接映射到面向对象的设计。有许多用于使用JSON的库和工具,这意味着很容易转换为其他格式

JSON是默认选择。除非有理由避免它,否则请使用它。在任何情况下,您都可以从JSON开始,稍后再切换。

答案 1 :(得分:1)

JSON。它在许多语言中被接受,轻量级并且将保持您拥有的这种层次结构。

答案 2 :(得分:0)

最简单的事情之一是尝试klepto,它提供了一个API来存储python中的关系数据。 klepto提供了一个字典接口,用于将项目存储在数据库中的键值对中,或者存储在磁盘上的类似数据库的存储中。您遇到的一个问题是将所有书籍存储在一个文件中。但是,如果您为每个文件存储一个条目(一本书),那么当您想要访问一本书时,它会更快。当您与字典对象进行交互时,klepto使您更容易,并且它将从磁盘上正确的pickle文件或存储在数据库中的对象中进行剩余的检索。 klepto旨在使大型数据存储和检索键值对变得容易。所以这是你应该解决的第一件事。 klepto将使您能够尝试在磁盘上存储每个文件一个条目,然后如果发现不够,则可以非常轻松地将存档后端切换到SQL数据库表(或多个表)。另一种选择是存储在hdf5文件中。

第二件事是您需要查看要使用的存储格式(picklejson等)。 klepto在一个通用界面中提供了近100种存储和编码格式组合,因此您可以通过尝试找出哪些对您有用,并查看哪个是最强大和最快的。正如其他人所建议的那样,如果您关心跨python版本的安全性和健壮性,我会选择json - 并且您要存储的对象很简单(看起来与您的对象相似)。如果你需要存储更复杂的对象,比如类实例或lambdas,那么你可能想要使用pickledill实际上)作为编码器...它会慢一点,但更强大。还有其他选项比picklejson快得多,但不是那么持久。在klepto中切换编码和存储格式也非常简单。