当前位置:首页 > 技术分析 > 正文内容

python散装笔记——49: JSON 模块

ruisui885个月前 (01-23)技术分析34

1: 将数据存储到文件中

以下代码段将 d 中存储的数据编码为 JSON 格式,并将其存储到文件中(用文件的实际名称替换 filename )。

import json

d = {
  'foo': 'bar',
  'alice': 1,
  'wonderland': [1, 2, 3]
}

with open(filename, 'w') as f:
  json.dump(d, f)

2: 从文件中读取数据

以下代码段打开一个 JSON 编码文件(用文件的实际名称替换 filename ),并返回存储在文件中的对象。

import json

with open(filename, 'r') as f:
  d = json.load(f)

3: 格式化 JSON 输出结果

假设我们有以下数据

>>> data = {"cats": [{"name": "Tubbs", "color": "white"}, {"name": "Pepper", "color": "black"}]}

仅仅将其转换为 JSON 并没有什么特别之处:

print(json.dumps(data))
{"cats": [{"name": "Tubbs", "color": "white"}, {"name": "Pepper", "color": "black"}]}

设置缩进以获得更漂亮的输出

如果我们想要漂亮的打印效果,可以设置缩进大小:

>>> print(json.dumps(data, indent=2))
{
  "cats": [
    {
      "name": "Tubbs",
      "color": "white"
    },
    {
      "name": "Pepper",
      "color": "black"
    }
  ]
}

按字母顺序排列键值,以获得一致的输出结果 默认情况下,输出中的键值顺序是未定义的。我们可以按字母顺序排列,确保输出结果始终一致:

print(json.dumps(data, sort_keys=True))
{"cats": [{"color": "white", "name": "Tubbs"}, {"color": "black", "name": "Pepper"}]}

剔除空白以获得紧凑的输出

我们可能希望去掉不必要的空格,这可以通过设置不同于默认: 的分隔符字符串来实现:

print(json.dumps(data, separators=(',', ':')))
{"cats":[{"name":"Tubbs","color":"white"},{"name":"Pepper","color":"black"}]}

4: loadvs loads, dumpvs dumps

json 模块包含读写 unicode 字符串和读写文件的函数。这些函数以函数名后面的 s 来区分。在这些示例中,我们使用的是 StringIO 对象,但同样的函数也适用于任何类文件对象。

这里我们使用基于字符串的函数:

import json

data = {u"foo": u"bar", u"baz": []}
json_string = json.dumps(data)
# u'{"foo": "bar", "baz": []}'
json.loads(json_string)
# {u"foo": u"bar", u"baz": []}

在这里,我们使用基于文件的功能:

import json
from io import StringIO

json_file = StringIO()
data = {u"foo": u"bar", u"baz": []}
json.dump(data, json_file)
json_file.seek(0) # Seek back to the start of the file before reading
json_file_content = json_file.read()
# u'{"foo": "bar", "baz": []}'
json_file.seek(0) # Seek back to the start of the file before reading
json.load(json_file)
# {u"foo": u"bar", u"baz": []}

正如你所看到的,主要区别在于转储 json 数据时必须将文件句柄传递给函数,而不是捕获返回值。另外值得注意的是,为了避免数据损坏,在读取或写入数据前,必须先找到文件的起始位置。打开文件时,光标位于位置 0,因此下面的方法也可以使用:

import json

json_file_path = './data.json'
data = {u"foo": u"bar", u"baz": []}

with open(json_file_path, 'w') as json_file:
  json.dump(data, json_file)
  
with open(json_file_path) as json_file:
  json_file_content = json_file.read()
  # u'{"foo": "bar", "baz": []}'

with open(json_file_path) as json_file:
  json.load(json_file)
  # {u"foo": u"bar", u"baz": []}

有了这两种处理 json 数据的方法,您就可以习惯性地、高效地使用基于 json 的格式,例如 pysparkjson-per-line

# loading from a file
data = [json.loads(line) for line in open(file_path).splitlines()]

# dumping to a file
with open(file_path, 'w') as json_file:
  for item in data:
    json.dump(item, json_file)
    json_file.write('\n')

记得要将上面代码中的 file_path 替换为实际的文件路径

5: 从命令行调用 json.tool以漂亮地打印 JSON 输出

给定某个 JSON 文件 "foo.json",如

{"foo": {"bar": {"baz": 1}}}

我们可以直接从命令行调用模块(将文件名作为参数传递)来漂亮打印:

$ python3 -m json.tool foo.json
{
  "foo": {
    "bar": {
      "baz": 1
    }
  }
}

该模块还将从 STDOUT 接收输入,因此(在 Bash 中)我们同样可以这样做:

$  cat foo.json | python3 -m json.tool

6: JSON 编码自定义对象

如果我们尝试以下方法

import json
from datetime import datetime
data = {'datetime': datetime(2024, 9, 26, 4, 44, 0)}
print(json.dumps(data))

我们会收到一个错误,提示 TypeError: Object of type datetime is not JSON serializable

为了能正确序列化 datetime 对象,我们需要编写自定义代码来转换它:

class DatetimeJSONEncoder(json.JSONEncoder):
  def default(self, obj):
    try:
      return obj.isoformat()
    except AttributeError:
      # obj 没有 isoformat 方法;让内置 JSON 编码器来处理吧
      return super(DatetimeJSONEncoder, self).default(obj)

然后使用该编码器类代替 json.dumps

encoder = DatetimeJSONEncoder()
print(encoder.encode(data))
# prints {"datetime": "2024-09-26T04:44:00"}

7: 从 Python dict 创建 JSON

import json
d = {
  'foo': 'bar',
  'alice': 1,
  'wonderland': [1, 2, 3]
}
json.dumps(d)

上述代码段将返回以下内容:

'{"wonderland": [1, 2, 3], "foo": "bar", "alice": 1}'

8: 从 JSON 创建 Python dict

import json
s = '{"wonderland": [1, 2, 3], "foo": "bar", "alice": 1}'
json.loads(s)

上述代码段将返回以下内容:

{u'alice': 1, u'foo': u'bar', u'wonderland': [1, 2, 3]}

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/496.html

分享给朋友:

“python散装笔记——49: JSON 模块” 的相关文章

vue3父子组件传对象,子组件访问修改父组件对象中的属性值

在Vue 3中,父子组件之间的数据传输通常通过props和emit进行。父组件可以通过props向下传递数据给子组件,子组件则可以通过emit向上通知父组件更新数据。如果需要在子组件中修改父组件对象中的属性值,可以使用一个名为ref的Vue 3新特性。以下是一个示例,演示了如何在Vue 3中实现父子...

代码管理-9-gitlab的使用和设置

gitlab使用1、外观设置完成后保存,返回登录页面查看关于注册,有些公司是不允许打开的,,有些人数非常多的公司就需要打开注册的功能,让人员自己注册,我们来给他特定的权限就可以,毕竟人非常多的时候还由我们来给她们注册就非常不现实了,工作量会很大2、自动注册3、组&用户&项目创建组设置组名称、描述等创...

GitLab 14.6发布,优化Geo高可用,安全更新等

昨天,GitLab官方按照管理发布了有一个月度版本GitLab 14.6的发布,这也是本年度收官版本。14.6中在安全合规性方面,在Geo方面以及MD代码块一键复制等方便做了优化,另外还在UI图标方面发布了一套全新的图标。详细情况请和虫虫一起学习。GitLab 14.6主要改进使用 Geo 实现无缝...

Python 幕后:Python导入import的工作原理

更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)Python 最容易被误解的方面其中之一是import。Python 导入系统不仅看起来很复杂。因此,即使文档非常好,它也不能让您全面了解正在发生的事情。唯一方法是研究 Python 执行 import 语句时幕后发生的事情。注意:在这篇文...

7 招教你轻松搭建以图搜图系统

作者 | 小龙责编 | 胡巍巍当您听到“以图搜图”时,是否首先想到了百度、Google 等搜索引擎的以图搜图功能呢?事实上,您完全可以搭建一个属于自己的以图搜图系统:自己建立图片库;自己选择一张图片到库中进行搜索,并得到与其相似的若干图片。Milvus 作为一款针对海量特征向量的相似性检索引擎,旨在...

BuildKit 镜像构建工具

#暑期创作大赛#快速开始 对于 Kubernetes 部署,请参阅examples/kubernetes。BuildKit 由buildkitd守护进程和buildctl客户端组成。虽然buildctl客户端可用于 Linux、macOS 和 Windows,但buildkitd守护程序目前仅适用于...