使用 JSON 保存和加载 Python 数据

JSON 格式使您无需创建自己的数据格式,如果您已经了解 Python,则尤其容易学习。以下是如何在 Python 中使用它。
135 位读者喜欢这个。
Databases as a service

Jason Baker。CC BY-SA 4.0。

JSON 代表 JavaScript 对象表示法。这种格式是一种流行的以键值对形式存储数据的方法,以便以后可以轻松解析。不过,不要被这个名称所迷惑:您可以在 Python 中使用 JSON,而不仅仅是 JavaScript,作为一种存储数据的简单方法,本文演示了如何入门。

首先,看看这个简单的 JSON 代码片段

{ 
	"name":"tux",
	"health":"23",
	"level":"4"
}

这是纯 JSON,没有为 Python 或任何其他语言进行修改。但是,如果您熟悉 Python,您可能会注意到这个 JSON 代码示例看起来非常像 Python 字典。事实上,两者非常相似:如果您熟悉 Python 列表和字典,那么 JSON 对您来说是很自然的。

以 JSON 格式存储数据

如果您的应用程序需要存储有些复杂的数据,您可以考虑使用 JSON。虽然您以前可能求助于自定义文本配置文件或数据格式,但 JSON 为您提供结构化、递归存储,而 Python 的 JSON 模块提供了将这些数据导入和导出应用程序所需的所有解析库。因此,您不必自己编写解析代码,其他程序员在与您的应用程序交互时也不必解码新的数据格式。因此,JSON 易于使用且无处不在。

以下是一些使用字典中字典的 Python 代码示例

#!/usr/bin/env python3

import json

# instantiate an empty dict
team = {}

# add a team member
team['tux'] = {'health': 23, 'level': 4}
team['beastie'] = {'health': 13, 'level': 6}
team['konqi'] = {'health': 18, 'level': 7}

此代码创建一个名为 team 的 Python 字典。它最初是空的(您可以创建一个已经填充的字典,但如果您还没有要放入字典的数据,那是不可能的)。

要添加到 dict 对象,您需要创建一个键,例如示例代码中的 tuxbeastiekonqi,然后提供一个值。在本例中,该值是另一个包含玩家统计信息的字典。

字典是可变的。您可以根据需要经常添加、删除和更新它们包含的数据。这种格式非常适合存储您的应用程序经常使用的数据。

以 JSON 格式保存数据

如果您存储在字典中的数据是用户数据,需要在应用程序退出后仍然存在,那么您必须将数据写入磁盘上的文件。这就是 JSON Python 模块的用武之地

with open('mydata.json', 'w') as f:
    json.dump(team, f)

此代码块创建一个名为 mydata.json 的文件,并以写入模式打开它。该文件用变量 f 表示(完全是任意指定;您可以使用任何您喜欢的变量名,例如 fileFILEoutput 或几乎任何名称)。同时,JSON 模块的 dump 函数用于将数据从 dict 转储到数据文件中。

从您的应用程序保存数据就是这么简单,而最好的部分是数据是结构化且可预测的。要查看,请查看生成的文件

$ cat mydata.json
{"tux": {"health": 23, "level": 4}, "beastie": {"health": 13, "level": 6}, "konqi": {"health": 18, "level": 7}}

从 JSON 文件读取数据

如果您要将数据保存为 JSON 格式,您可能最终希望将数据读回 Python 中。为此,请使用 Python JSON 模块的 json.load 函数

#!/usr/bin/env python3

import json

f = open('mydata.json')
team = json.load(f)

print(team['tux'])
print(team['tux']['health'])
print(team['tux']['level'])

print(team['beastie'])
print(team['beastie']['health'])
print(team['beastie']['level'])

# when finished, close the file
f.close()

此函数或多或少实现了保存文件的逆过程:任意变量 (f) 表示数据文件,然后 JSON 模块的 load 函数将数据从文件转储到任意 team 变量中。

代码示例中的 print 语句演示了如何使用数据。将 dict 键复合到 dict 键上可能会让人困惑,但只要您熟悉自己的数据集,或者可以读取 JSON 源代码以获得它的思维导图,那么这种逻辑就很有意义。

当然,print 语句不必是硬编码的。您可以使用 for 循环重写示例应用程序

for i in team.values(): 
    print(i) 

使用 JSON

正如您所看到的,JSON 与 Python 结合得非常好,因此当您的数据适合其模型时,它是一种很棒的格式。JSON 灵活且易于使用,并且学习一种基本上意味着您正在学习另一种,因此下次您在处理 Python 应用程序时,请考虑将其用于数据存储。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且常常同时从事这两个行业。

1 条评论

您可能还想查看模块“simplejson”。它们曾经是相同的,但 json 是内置在标准库中的,而 simplejson 是在标准库之外维护的,因此它们现在有所不同。如果您在网上搜索它们,您碰巧会发现许多关于速度的比较(在某些操作中,某个版本的速度比某个版本的速度更快/更慢,等等)。对我来说,一个特别的考虑因素是 simplejson 支持更多类型,对我来说这些是 Decimal [1] 和 datetime [2]。由于我不想依赖外部库,该库(也)没有内置在 EL7 中,所以我决定使用 json,并且不得不修补我的代码 [1][2] 以手动处理它们。不知道两者最新版本(python3 中的最新 json 与最新 simplejson)的当前状态是什么,但我猜它们在这方面仍然有所不同。因此,如果您打算将它们用于非平凡数据(例如,您从复杂的数据库模式中获得的数据),请检查并比较两者,然后决定使用哪一个。希望这有帮助,

[1] https://gerrit.ovirt.org/67352

[2] https://gerrit.ovirt.org/71130

Didi

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.