会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 4个小窍门,让你在Python中高效使用JSON!

4个小窍门,让你在Python中高效使用JSON

时间:2025-11-05 13:53:20 来源:益强数据堂 作者:域名 阅读:864次

本文转载自公众号“读芯术”(ID:AI_Discovery)。个小高效

字典和列表是窍门 Python的两种数据类型,也是使用用来处理JSON的完美工具。本文将主要分享以下内容:

如何载入、个小高效编写JSON?窍门 如何在命令行上优化、校验JSON?使用 如何通过使用JMESPath对JSON文档执行高级查询?

1. JSON解码

Python自带一个功能强大、内容丰富的个小高效JSON库。可通过以下方式导入:

import json 

解码JSON字符串很简单,窍门直接输入 json.loads(…) 即可。使用它可以转换成:

字典对象 列表数组 识别布尔值、个小高效整数、窍门浮点数和字符串,使用在Python中进行正确转换。个小高效 任何 null 都将被转换为Python的窍门None类型。

以下为json.loads 的使用一个实例:

>>> import json >>> jsonstring = {"name": "erik","age": 38, "married": true} >>> json.loads(jsonstring){name: erik, age: 38, married: True} 

2. JSON编码

编码JSON也很简单。使用json.dumps(…) 把由字典、列表和其他本机类型组成的云南idc服务商Python对象转换为字符串:

>>> myjson = {name: erik, age: 38, married: True} >>> json.dumps(myjson){"name": "erik", "age": 38, "married":true} 

这其实是一个完全相同的文档,只是被转换成了字符串。所以,要想让JSON文档更易读,可使用缩进选项:

>>> print(json.dumps(myjson, indent=2)) {   "name": "erik",   "age": 38,   "married": true } 

3. 命令行用法

JSON库也可从命令行使用,以校验、优化JSON:

$ echo "{ "name": "Monty", "age":45 }" | \ python3 -m json.tool {     "name": "Monty",     "age": 45 } 

如果你的电脑系统是Mac或Linux,并且能够安装JSON库的话,那么你也可以研究一下jq 命令行工具。它除了有便于记忆,可以润色代码等优点外,还有许多其他特点。

jq将在默认情况下优化JSON

4. 使用JMESPath搜索JSON

JMESPath是一种JSON查询语言。它能够让你轻松地从JSON文档中获取所需数据。如果你用过JSON,就会觉得获取嵌套值并不难。源码库

例:doc["person"]["age"]将在一个如下所示的文档中获取age的嵌套值:

{   "persons": {     "name": "erik",     "age": "38"   }} 

但如果是像下面这样的文档,该如何从这一组人名中提取所有年龄字段呢?

{   "persons": [     { "name": "erik","age": 38 },     { "name": "john","age": 45 },     { "name": "rob","age": 14 }   ]} 

我们可以简单地写一套关于这些人名的重复指令。虽然很容易,但重复指令运行较慢,会使你的代码复杂化。所以,这就该派JMESPath上场了!

用JMESPath表达式编写代码:

persons[*].age 

它将返回一个包含所有年龄的数组:[38, 45, 14].

假设要筛选列表,只获取名为“erik”的人的年龄。你可以编写一个筛选程序来执行此操作:

persons[?name==erik].age 

看,多么流畅!

因为JMESPath不属于Python标准库,所以你需要一起安装pip或pipenv。例如,在虚拟环境中使用pip:

$ pip3 install jmespath $ python3Python 3.8.2 (default, Jul 16 2020, 14:00:26) >>> import jmespath >>> j = { "people": [{ "name": "erik","age": 38 }] } >>> jmespath.search("people[*].age", j) [38] >>> 

现在就去试一试吧!请严格按照交互式教程操作,同时也不要忘了在JMESPath站点上查看示例哦!

【责任编辑:赵宁宁 TEL:(010)68476606】

站群服务器

(责任编辑:IT科技)

最新内容
推荐内容
  • VivoXplay6(探索VivoXplay6在音乐体验方面的绝佳表现)
  • Ubuntu是一个以桌面应用为主的Linux操作系统,是linux平台下很受欢迎的系统。Putty是Windows上常用的登录Linux的终端工具。登录终端如图系统内登录终端一样。默认情况下,ubuntu终端上显示的中文字符常常是乱码。下面就说下,如何解决Putty登录Ubuntu中文显示乱码问题。1、在使用putty连接登录Linux时,发现了终端下显示乱码,如下图所示。2、之后,在终端下输入echo $LANG $LANGUAGE,回测。之后即可看到en_US、UTF-8。这个信息说明该系统下支持这两种字符集。3、之后,选择标题,右击选择菜单中的“Change Settings”选项。4、之后,进入到putty的设置页面。同时,也可以直接双击putty运行程序,进入到设置页面。5、进入到设置页面之后,选择左侧点击【Window】下的“Translation”选项,之后在右侧会看到“Remote character set:”选项。6、通过下拉菜单,选择“UTF-8”字符集选项。7、之后,再次在终端下输入相应的指令,即可看到显示正常的中文编码了。8、最后,下次登录服务器只要双击putty.exe,然后在页面中输入IP以及端口(默认22即可),然后【Open】就可以连接ubuntu服务器了。连接服务器需要进行身份验证,输入系统的用户名以及密码。注意事项:中文乱码的解决也需要系统的支持,本经验验证是在ubuntu下进行的。
  • 虚拟机下面安装了ubuntu系统,显示的屏幕只有那么一小块儿,不知道如何才能全屏,那么如何全屏呢?且看下面经验。1、打开虚拟机,并点击要更改成全屏的那个ubuntu系统的电源,我的虚拟机名字就叫ubuntu,那么就点击【打开此虚拟机电源】2、等虚拟机打开之后,我们点击虚拟机软件上面工具栏中的【虚拟机(V)】,会展现出一个下拉菜单。3、在下拉菜单中,我们找到并使用鼠标左键单击【安装Vmware工具】,假如你这里是灰色的,那么可能是 因为你的虚拟机版本比较低!4、点击以上选项后,我们进入到系统里面,找到在桌面上出现的wmware tools的光盘!我们点击进入其中。5、在vmware tools虚拟光盘里面,我们双击【vmware****.tar.gz】这个文件,注意我这里的****是任意字符的意思哦,每个虚拟机的版本可能不一。6、复制这个【vmware****.tar.gz】文件,到【文件】--->【home】文件夹里面。7、然后按【Ctrl+Alt+T】调出命令界面,然后在里面输入【tar -zxvf v】后按【Tab】键,自动补全整个工具的名字。然后按enter执行。8、然后在终端里面输入【cd V】,再按一次TAB键补全被解压后的那个工具目录名字。回车后进入到该工具解压后的目录里面!最后输入【sudo ./vmware-install.pl】执行即可安装成功,安装成功后,按【CTRL+Alt+enter】键就能给ubuntu全屏啦。假如还有疑问,可以提问我,我会第一时间回答的。
  • 说明:系统:Ubuntu Server 11.10系统:Windows Server 2003################################################################################################### Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesnt use lo0# Accepts all established inbound connections# Allows all outbound traffic-A OUTPUT -j ACCEPT-A INPUT -p tcp --dport 80 -j ACCEPT-A INPUT -p tcp --dport 873 -j ACCEPT# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE# Now you should read up on iptables rules and consider whether ssh access# Allow ping# log iptables denied calls (access via dmesg command)# Reject all other inbound - default deny unless explicitly allowed policy:-A FORWARD -j REJECT##################################################################################################ctrl+o #保存ctrl+x #退出备注:873是Rsync端口iptables-restore < /etc/iptables.default.rules #使防火墙规则生效nano /etc/network/if-pre-up.d/iptables #创建文件,添加以下内容,使防火墙开机启动###########################################################!/bin/bashwhereis rsync #查看系统是否已安装rsync,出现下面的提示,说明已经安装ctrl+o #保存log file = /var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建。/etc/init.d/rsync start #启动Next 下一步Next默认安装路径 C:Program FilescwRsyncInstall 安装Close 安装完成,关闭3、测试是否与Rsync服务端通信成功开始-运行-cmd输入cd C:Program FilescwRsyncbin 回车再输入telnet 192.168.21.168 873 回车出现下面的界面,说明与Rsync服务端通信成功备注 C:Program FilescwRsyncbin 是指cwRsync程序安装路径4、cwRsync客户端同步Rsync服务端的数据开始-运行-cmd,输入cd C:Program FilescwRsyncbin 回车再输入rsync -vzrtopg --progress --delete mysqlbakuser@192.168.21.168::MySQL_Backup /cygdrive/d/mysql_data输入密码:123456 回车出现下面的界面,说明数据同步成功可以打开D:mysql_data 与Rsync服务端/home/mysql_data目录中的数据对比一下,查看是否相同d/mysql_data 代表D:mysql_data192.168.21.168 #Rsync服务端IP地址-vzrtopg --progress #显示同步过程详细信息三、在cwRsync客户端的任务计划中添加批处理脚本文件,每天凌晨3:00钟自动同步Rsync服务端/home/mysql_data目录中的数据到D:mysql_data目录1、打开C:Program FilescwRsyncbin目录,新建passwd.txt输入123456保存继续在C:Program FilescwRsyncbin目录,新建MySQL_Backup.bat输入echo.echo.rsync -vzrtopg --port=873 --progress --delete mysqlbakuser@192.168.21.168::MySQL_Backup /cygdrive/d/mysql_data < passwd.txtecho 数据同步完成echo.最后保存退出2、添加批处理脚本到Windows任务计划开始-设置-控制面板-任务计划打开添加任务计划,下一步浏览,选择打开C:Program FilescwRsyncbin目录里面的MySQL_Backup.bat执行这个任务:选择每天,下一步起始时间:3:00运行这个任务:每天,下一步输入Windows系统管理员的登录密码,下一步完成扩展说明:假如要调整同步的时间,打开任务计划里面的MySQL_Backup切换到日程安排来选项设置,还可以打开高级来设置每隔几分钟运行一次MySQL_Backup.bat这个脚本至此,Ubuntu Server Rsync服务端与Windows cwRsync客户端实现数据同步完成
  • 终端居然无法启动了,这是神马情况啊!突然想起,前一天更新了软件源,结果一下子贪多,软件源弄多了,导致update的时候等待了so long time ,于是等不急了,ctrl + c果断结果掉了今天再一启动,于是就悲剧了,终端无法启动,啥事都干不了!!!网上一艘,说启动gnome-termial试试,我在xterm里面启动gnome-terminal居然提示说没这个程序,于是sudo apt-get install gnome-terminal 果断解决问题!!有没有搞错!于是顺便装下wine,可惜这12.4软件包里面默认没有wine,不解!!于是手动安装了!!
  • 今天查了一下,squid对dns的支持是这样一个原理: 1、假如dns server发送域名时带有ttl,则以此ttl为准,一般dns server都会带有对ttl的支持,现在我用的dnsmasq默认ttl是0。 2、假如dns server没发送ttl(ttl=0),squid就以自己的配置positive_dns_ttl为准,这个配置默认是6小时。 3、原先squid里配置的一个negative_dns_ttl,证实是配错了,这个配置指的是squid在取不到域名(出错)的情况下会多久再去重取。 我原先的情况是positive_dns_ttl和dns server的ttl都没有配置而配置了negative_dns_ttl,这时squid以默认的positive_dns_ttl为准,即6小时,这个时间对web服务器来说太长了。当前我解决的办法是修改dns server的ttl为60 有些朋友可能是用bind来做的dns,bind可能默认的ttl并不是0,所以用positive_dns_ttl配置不起效的话,修改ttl值就好。 附:检测dns服务器ttl值的方法 在一台linux机器上,修改/etc/resolv.conf将dns指向到要测试的dns,然后执行 dig test.com 假如该dns能解析test.com,就会返回一系列数据,其中有一列指明了ttl值,一试即知。
热点内容