Python序列化和反序列化

Python序列化和反序列化

JSON 的全称是 JavaScript Object Notation,即 JavaScript 对象符号,它是一种轻量级、跨平台、跨语言的数据交换格式,其设计意图是把所有事情都用设计的字符串来表示,这样既方便在互联网上传递信息,也方便人进行阅读。

最早的时候,JSON 是 JavaScript 语言的数据交换格式,后来慢慢发展成一种语言无关的数据交换格式,这一点非常类似于 XML。但是我感觉操作json比操作XML简单多了

JSON 主要有如下两种数据结构:

  • 由 key-value 对组成的数据结构。这种数据结构在不同的语言中有不同的实现。例如,在 JavaScript 中是一个对象;在 Python 中是一种 dict 对象;在 C 语言中是一个 struct;在其他语言中,则可能是 record、dictionary、hash table 等。
  • 有序集合。这种数据结构在 Python 中对应于列表;在其他语言中,可能对应于 list、vector、数组和序列等。

上面两种数据结构在不同的语言中都有对应的实现,因此这种简便的数据表示方式完全可以实现跨语言。所以,JSON 可以作为程序设计语言中通用的数据交换格式。

Python 中JSON 的使用

json 模块提供了对 JSON 的支持,它既包含了将 JSON 字符串恢复成 Python 对象的函数,也提供了将 Python 对象转换成 JSON 字符串的函数。

json 模块中常用的函数和类的功能如下:

1. json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

将 obj 对象转换成 JSON 字符串输出到 fp 流中,fp 是一个支持 write() 方法的类文件对象。

2. json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan= True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

将 obj 对象转换为 JSON 字符串,并返回该JSON 字符串。

3. json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

从 fp 流读取 JSON 字符串,将其恢复成 JSON 对象,其中 fp 是一个支持 write() 方法的类文件对象。

4. json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

将 JSON 字符串 s 恢复成 JSON 对象。

简单的文件存储读取操作

一般我们提取到相关数据之后会保存为json格式的文件,方便我们后面再次进行一些读取操作

moves={
    '惊悚片':{"电影名称":"黑道传奇",
    "导演": "布莱恩·海尔格兰德",
    "简介":"由帅哥汤老师主演,英伦风格的黑帮,不多介绍。",
    "在线播放:":"http://api.ledboke.com/vip/?url=https://www.iqiyi.com/v_19rrdt8lmo.html"},
    '喜剧片':{"电影名称":"婚礼傲客",
    "导演": "大卫·道金",
    "简介":"两个特别会撩妹的在线教你撩妹,你也可以睡变所有的婚礼女郎",
    "在线播放:":"http://api.ledboke.com/vip/?url=https://www.iqiyi.com/v_19rra4jjww.html"       },
    '动作片':{"电影名称":"伦敦陷落",
    "导演": "巴巴克·纳加非",
    "简介":"处处都是危机,敌我难以区分,适合呢中喜欢打架的男孩子。",
    "在线播放:":"http://api.ledboke.com/vip/?url=https://www.iqiyi.com/v_19rrlt6iw8.html"},
    '魔幻片':{"电影名称":"诸神之战",
    "导演": "路易斯·莱特里尔",
    "简介":"影片看点就是美杜莎了,在可怕的人,也有呆萌的一面",
     "在线播放:":"http://api.ledboke.com/vip/?url=https://www.iqiyi.com/v_19rra7ks34.html"      },
}
#---------------->;写入
# f=open('text.text','w',encoding='utf-8')
# #f.write(moves)  #字典不能直接写入文件,只能写入字符串
# f.write(str(moves)) #可以使用这样存储,存储的过程就是序列化,相反读取内容就是反序列化
#
# f.close()

#---------------->;读取
f=open('text.text','r',encoding='utf-8')
# data=f.read()
# f.close()
#print(data['惊悚片']) #显然不能使用这种读取方式,因为上面存储的是字符串
data=eval(f.read())
f.close()
print(data['惊悚片'])
使用JSON
import json
moves={
    '惊悚片':{"电影名称":"黑道传奇",
    "导演": "布莱恩·海尔格兰德",
    "简介":"由帅哥汤老师主演,英伦风格的黑帮,不多介绍。",
    "在线播放:":"http://api.ledboke.com/vip/?url=https://www.iqiyi.com/v_19rrdt8lmo.html"},
    '喜剧片':{"电影名称":"婚礼傲客",
    "导演": "大卫·道金",
    "简介":"两个特别会撩妹的在线教你撩妹,你也可以睡变所有的婚礼女郎",
    "在线播放:":"http://api.ledboke.com/vip/?url=https://www.iqiyi.com/v_19rra4jjww.html"       },
    '动作片':{"电影名称":"伦敦陷落",
    "导演": "巴巴克·纳加非",
    "简介":"处处都是危机,敌我难以区分,适合呢中喜欢打架的男孩子。",
    "在线播放:":"http://api.ledboke.com/vip/?url=https://www.iqiyi.com/v_19rrlt6iw8.html"},
    '魔幻片':{"电影名称":"诸神之战",
    "导演": "路易斯·莱特里尔",
    "简介":"影片看点就是美杜莎了,在可怕的人,也有呆萌的一面",
     "在线播放:":"http://api.ledboke.com/vip/?url=https://www.iqiyi.com/v_19rra7ks34.html"      },
}
#----------->;写入
# f=open('text.text','w',encoding='utf-8')
# f.write(json.dumps(moves)) #序列化
# f.close()
# print(json.dumps(moves))
#----------->;读取
f=open('text.text','r',encoding='utf-8')
data=json.loads(f.read())  #反序列化
f.close()
print(data['惊悚片'])

Json是所有语言都通用的,它只适合一些简单数据类型,字典、列表、字符串等等,,它主要是用于不同语言之间的数据交互。我们想要加入一些函数,类,使用json就不行了,因为各种语言之间的函数、类都比较复杂。

json.loads()函数中的字符串需要是严格的json串格式,表示键值对的字符不能用单引号
import json
data="{'name':'zjj','zjj博客':'e1yu',[1,2,34]}"
# a=json.loads(data) #键值对是用单引号,所以json序列后会报错
# print(a)

#你可以先dumps一下,在loads
data_list=json.dumps(data)
b=json.loads(data_list)
print(data_list)
print(b)
import json
def fun():
    print('我是一个函数')
info={'name':'zjj',
      'age':18,
      'function':fun}
f=open('text.text','w',encoding='utf-8')
f.write(json.dumps(info)) #json不能序列化函数
f.close()

想要处理复杂的就需要使用pickle

import pickle
def fun():
    print('我是一个函数')
info={'name':'zjj',
      'age':18,
      'function':fun}
f=open('text.text','wb')
f.write(pickle.dumps(info)) #json不能序列化函数
f.close()

pickle只有在Python本语言里面可以使用

分享到 :

发表评论

登录... 后才能评论