专栏首页python3python 读取与存储json

python 读取与存储json

官方文档:http://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

JSON在python中分别由list和dict组成。

这是用于序列化的两个模块:

  • json: 用于字符串和python数据类型间进行转换
  • pickle: 用于python特有的类型和python的数据类型间进行转换
  • Json模块提供了四个功能:dumps、dump、loads、load

json dumps把数据类型转换成字符串 dump把数据类型转换成字符串并存储在文件中 loads把字符串转换成数据类型 load把文件打开从字符串转换成数据类型

json是可以在不同语言之间交换数据的,而pickle只在python之间使用。json只能序列化最基本的数据类型,josn只能把常用的数据类型序列化(列表、字典、列表、字符串、数字、),比如日期格式、类对象!josn就不行了。而pickle可以序列化所有的数据类型,包括类,函数都可以序列化。

import json

# Writing JSON data
with open('data.json', 'w') as f:
    json.dump(data, f)

# Reading data back
with open('data.json', 'r') as f:
    data = json.load(f)

字典排序

问题 你想创建一个字典,并且在迭代或序列化这个字典的时候能够控制元素的顺序。

解决方案 为了能控制一个字典中元素的顺序,你可以使用 collections 模块中的 OrderedDict 类。 在迭代操作的时候它会保持元素被插入时的顺序,示例如下:

from collections import OrderedDict

d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"
for key in d:
    print(key, d[key])

OrderedDict 内部维护着一个根据键插入顺序排序的双向链表。每次当一个新的元素插入进来的时候, 它会被放到链表的尾部。对于一个已经存在的键的重复赋值不会改变键的顺序。

需要注意的是,一个 OrderedDict 的大小是一个普通字典的两倍,因为它内部维护着另外一个链表。 所以如果你要构建一个需要大量 OrderedDict 实例的数据结构的时候(比如读取 100,000 行 CSV 数据到一个 OrderedDict 列表中去), 那么你就得仔细权衡一下是否使用 OrderedDict 带来的好处要大过额外内存消耗的影响。


# from collections import ChainMap
# # dict(index=0,name='none',width=0,height=0,bbox=str([0,0,0,0]),gender='none',age=0,mask='none',glass='none',hat='none')
# jsonDefault=dict(bbox=str([0,0,0,0]),gender='male',age=0,mask='none',glass='none',hat='none')

# # name:文件名str,width:图片宽int,height:图片高int,bbox:str([0,1,2,3]),
# # gender:"male"|"female",glass:"sunglasses"|"glasses"|"none",age:年龄值int,hat:"Yes"|"No",
# jsonTemp=lambda args:'''{{"image_key":"{name}","video_name":"1","video_index":"{index}","width":{width},"height":{height},"face":[{{"id":1,"track_id":-1,"data":{bbox},"struct_type":"rect","attrs":{{"gender":"{gender}","has_glasses":"{glass}","specific_age":"{age}","has_mask":"none","Wear_a_hat":"{hat}","occlusion":"{asvisible}"}}}}]}}
# '''.format(**ChainMap(args,jsonDefault))

# # 为什么不使用json标准的空值:null

from collections import ChainMap
# dict(index=0,name='none',width=0,height=0,bbox=str([0,0,0,0]),gender='none',age=0,mask='none',glass='none',hat='none')
jsonDefault=dict(bbox=str([0,0,0,0]),gender='male',age=0,mask='none',glass='none',hat='none')

# name:文件名str,width:图片宽int,height:图片高int,bbox:str([0,1,2,3]),
# gender:"male"|"female",glass:"sunglasses"|"glasses"|"none",age:年龄值int,hat:"Yes"|"No",
jsonTemp=lambda args:'''{{"image_key":"{name}","video_name":"1","video_index":"{index}","width":{width},"height":{height},"face":[{{"id":1,"track_id":-1,"data":"none","struct_type":"rect","attrs":{{"gender":"{gender}","has_glasses":"none","specific_age":"{age}","has_mask":"none","Wear_a_hat":"none","occlusion":"none","ignore":"no"}}}}]}}
'''.format(**ChainMap(args,jsonDefault))

# 为什么不使用json标准的空值:null

# 基础 转换结果至指定json格式
def toJson(re_fileName):
    result = []
    for j, cur_line in enumerate(open(re_fileName).readlines()):
        (ind,sex,age,mask,glass,sunglass,hat,img) = (i.strip() for i in cur_line.strip().split('\t'))
        form=dict(index=int(float(ind)),name=img,width=72,height=72,gender='male' if int(float(sex))==1 else 'female',age=int(float(age)))
        result.append(jsonTemp(form))
    return result

re_fileName = 'filename.lst'
ipc_train_result=toJson(re_fileName)

with open('filename.json','w+') as f:
    for i in ipc_train_result:
        f.write(i)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [Python]数据结构--Bitmap

    bitmap是很常用的数据结构,比如用于Bloom Filter中、用于无重复整数的排序等等。bitmap通常基于数组来实现,数组中每个元素可以看成是一系列二进...

    py3study
  • RedHatLinux AS3 U3 安

    RedHat Linux AS3.0上安装OracleDB一直比较麻烦,多方寻找,终于找到一个测试可以成功的安装手册。

    py3study
  • python_函数递归

    py3study
  • 新手也能看懂的Python开发环境搭建

    看到有很多同学都想学Python,所以我来为大家介绍一下Python开发环境的搭建,帮助大家快速开始学习。

    乐百川
  • 速读原著-TCP/IP(SNMP:Trap)

    本章我们看到的例子都是从管理进程到代理进程的。当然代理进程也可以主动发送 t r a p到管理进程,以告诉管理进程在代理进程侧有某些管理进程所关心的事件发生,如...

    cwl_java
  • Golang web基础——JSON

    使用json.Marshal()函数可以对一组数据进行JSON格式的编码。 json.Marshal()函数的声明如下:

    羊羽shine
  • MySQL复制问题的三个参数介绍

    今天星期二,早上居然起晚了,上班迟到了,简直是。。。废话不多说,在昨天的文章中,我们提到了三个参数,分别是:

    AsiaYe
  • SpringBoot中使用@Scheduled创建定时任务

    我们在编写SpringBoot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信、邮件之类的操作,也可能会定时地检查和监控一些标志、参数等。

    JouyPub
  • 人工智能在疾病传播方面的应用

    近期,新型冠状病毒声势浩大,人工智能的作用值得关注。——在控制其他疾病传播方面,算法不仅提供了更好的干预和预防策略,还帮助优化了资源分配,以抗击感染的传播。

    AiTechYun
  • python 数据可视化有哪几个常用的库 ?

    前段时间有读者向我反映,想看看数据可视化方面的文章,这不?现在就开始写了,如果你想看哪些方面的文章,可以通过留言或者后台告诉我。数据可视化的第三方库挺多的,这里...

    小小詹同学

扫码关注云+社区

领取腾讯云代金券