如何在 python 中存储嵌套数据?
How to store nested data in python?
我有如下标记为 '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 个这样的对象,每个对象都是从 Internet 上抓取的。鉴于每一个'book'都需要一些功夫和时间,所以我想一一保存。我认为 JSON 不允许我这样做,我目前正在使用 pickle。但是,稍后我可能需要参考某本书。恐怕我必须一遍又一遍地解开才能做到这一点。就我而言,存储这些对象的最佳方式是什么?
我最终决定用行分隔 JSON。
JSON。它被多种语言接受,轻量级,并将保持您拥有的这种层次结构。
政治正确的答案是"it depends"。也就是说,选择 JSON
.
Pickle
是一种强大的格式,能够重建具有丰富数据类型的复杂对象。但是,它相对较慢,它将您绑定到 python 并且对于不受信任的数据不是 100% 安全的。 它提供了丰富的类型,但没有速度、便携性或安全性。它也是 人类不可读的。
XML
是一种旧格式,即将停止使用。它不直接映射到面向对象的设计。在大多数现代语言中阅读和写作 XML
是繁琐、冗长的,并且会产生令人不安的抽象。 今天使用 XML 的理由很少。
JSON
是一种被广泛采用的轻量级格式。它提供有限的数据类型(例如缺少日期)。这意味着 stringifying 很多类型,但也意味着格式相对安全:不受信任的数据不会让您大吃一惊。它快速、高度便携且易于阅读。它几乎直接映射到面向对象的设计。 许多库和工具可用于 JSON,这意味着 可以轻松转换为其他格式。
JSON
是默认选择。除非有理由避免它,否则请使用它。无论如何,您可以从 JSON
开始,然后再切换。
最简单的方法之一是尝试 klepto
,它提供 API 以在 python 中存储关系数据。 klepto
提供了一个字典接口,用于将项目存储在数据库中的键值对中,或者存储在磁盘上的类似数据库的存储中。您遇到的问题之一是将所有书籍存储在一个文件中。但是,如果您为每个文件存储一个条目(一本书),那么当您想要访问一本书时,速度会快得多。 klepto
使这对你来说很容易,因为你与字典对象交互,它会从磁盘上正确的 pickled 文件或存储在数据库中的对象中检索其余的内容。 klepto
的目的是使处理大数据存储和检索键值对变得容易。所以这是你应该解决的第一件事。 klepto
将使您能够尝试在磁盘上存储每个文件一个条目,然后如果您发现不够,可以很容易地将存档后端切换到 SQL 数据库 table(或 tables)。另一种选择是存储在一个或多个 hdf5
文件中。
第二件事是您需要查看要使用的存储格式(pickle
、json
等)。 klepto
在一个通用界面中提供了近 100 种存储和编码格式组合,因此您可以通过尝试找出最适合您的组合,看看哪种组合最稳健、速度最快。正如其他人所建议的那样,如果您关心 python 各个版本的安全性和健壮性,我会选择 json
—— 并且您要存储的对象很简单(看起来像您的一样)。如果你需要存储更复杂的对象,比如 class 实例或 lambda,那么你可能想使用 pickle
(实际上是 dill
)作为编码器……它会有点慢,但是更健壮。还有其他选项比 pickle
或 json
快得多,但不那么持久。在 klepto
中切换编码和存储格式也很容易。
我有如下标记为 '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 个这样的对象,每个对象都是从 Internet 上抓取的。鉴于每一个'book'都需要一些功夫和时间,所以我想一一保存。我认为 JSON 不允许我这样做,我目前正在使用 pickle。但是,稍后我可能需要参考某本书。恐怕我必须一遍又一遍地解开才能做到这一点。就我而言,存储这些对象的最佳方式是什么?
我最终决定用行分隔 JSON。
JSON。它被多种语言接受,轻量级,并将保持您拥有的这种层次结构。
政治正确的答案是"it depends"。也就是说,选择 JSON
.
Pickle
是一种强大的格式,能够重建具有丰富数据类型的复杂对象。但是,它相对较慢,它将您绑定到 python 并且对于不受信任的数据不是 100% 安全的。 它提供了丰富的类型,但没有速度、便携性或安全性。它也是 人类不可读的。
XML
是一种旧格式,即将停止使用。它不直接映射到面向对象的设计。在大多数现代语言中阅读和写作 XML
是繁琐、冗长的,并且会产生令人不安的抽象。 今天使用 XML 的理由很少。
JSON
是一种被广泛采用的轻量级格式。它提供有限的数据类型(例如缺少日期)。这意味着 stringifying 很多类型,但也意味着格式相对安全:不受信任的数据不会让您大吃一惊。它快速、高度便携且易于阅读。它几乎直接映射到面向对象的设计。 许多库和工具可用于 JSON,这意味着 可以轻松转换为其他格式。
JSON
是默认选择。除非有理由避免它,否则请使用它。无论如何,您可以从 JSON
开始,然后再切换。
最简单的方法之一是尝试 klepto
,它提供 API 以在 python 中存储关系数据。 klepto
提供了一个字典接口,用于将项目存储在数据库中的键值对中,或者存储在磁盘上的类似数据库的存储中。您遇到的问题之一是将所有书籍存储在一个文件中。但是,如果您为每个文件存储一个条目(一本书),那么当您想要访问一本书时,速度会快得多。 klepto
使这对你来说很容易,因为你与字典对象交互,它会从磁盘上正确的 pickled 文件或存储在数据库中的对象中检索其余的内容。 klepto
的目的是使处理大数据存储和检索键值对变得容易。所以这是你应该解决的第一件事。 klepto
将使您能够尝试在磁盘上存储每个文件一个条目,然后如果您发现不够,可以很容易地将存档后端切换到 SQL 数据库 table(或 tables)。另一种选择是存储在一个或多个 hdf5
文件中。
第二件事是您需要查看要使用的存储格式(pickle
、json
等)。 klepto
在一个通用界面中提供了近 100 种存储和编码格式组合,因此您可以通过尝试找出最适合您的组合,看看哪种组合最稳健、速度最快。正如其他人所建议的那样,如果您关心 python 各个版本的安全性和健壮性,我会选择 json
—— 并且您要存储的对象很简单(看起来像您的一样)。如果你需要存储更复杂的对象,比如 class 实例或 lambda,那么你可能想使用 pickle
(实际上是 dill
)作为编码器……它会有点慢,但是更健壮。还有其他选项比 pickle
或 json
快得多,但不那么持久。在 klepto
中切换编码和存储格式也很容易。