今日主要内容
- 内置模块(标准库)
- 序列化
- hashlib
- collections
- 软件开发规范
一、内置模块(标准库)
(一)序列化模块
- 什么是序列化?
- 将一种数据结构(如列表、字典)转换为另一种特殊的数据结构(如字符串、bytes类型)的过程就是序列化过程
- 数据传输的过程中,传输的都是字节,现在有一个列表需要传输,我需要将列表转换为字符串,在将字符串进行编码,但对方最终接收到的是一个字符串,字符串是不能原封不动的还原成列表的,这时候就需要用到反序列化将字符串转换回列表
1.json模块(重要)
json文件相当于编程界的普通话,是各种语言交互的枢纽,当数据需要在多种语言间传输,就必须将数据转换成json字符串,对方将接受到的json字符串再转换成对应语言的数据类型,完美还原
json模块方法介绍:
json.dumps() 将对象序列化 json.loads() 将对象反序列化 json.dump() 将对象序列化写入文件 json.load() 将对象读取后反序列化 dumps、loads
:用于网络传输dump、load
:用于文件写读
json.dumps()
- 函数定义:
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)
- 函数说明:将对象序列化为json格式的字符串,其余参数中的
ensure_ascii
:若对象中出现的非ascii字符(如中文)时会被转换,若显示原字符,指定ensure_ascii=False
import json print(json.dumps(["张旭东666"])) print(json.dumps(["张旭东666"], ensure_ascii=False)) 运行结果: ["\u5f20\u65ed\u4e1c666"] ["张旭东666"]
- 函数定义:
json.loads()
- 函数定义:
loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 函数说明:将json格式的字符串反序列化
import json print(json.loads("[1,2,3,4]")) print(type(json.loads("[1,2,3,4]"))) 运行结果: [1, 2, 3, 4] <class 'list'>
- 函数定义:
json.dump()
- 函数定义:
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)
- 函数说明:将对象转换为json流写入到文件(fp为文件句柄)中
import json with open("text.txt", "w", encoding="utf-8") as f: json.dump([1, 2, 3, 4], f)
- 函数定义:
json.load()
- 函数定义:
load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 函数说明:读取文件句柄并将字符串反序列化
with open("text.txt", encoding="utf-8") as f: lst = json.load(f) print(lst) print(type(lst)) 运行结果: [1, 2, 3, 4] <class 'list'>
- 函数定义:
如果向文件中写入多个json串,无法读取,因为在文件中写入的都是一行内容
- 解决方法1:将所有内容准备好了一次性写入和读取
import json lst = [{"k1": 1}, {"k2": 2}, {"k3": 3}] # 准备好放在一起 with open("text.txt", "w+", encoding="utf-8") as f: json.dump(lst, f) # 一起写入 f.seek(0) for el in json.load(f): # 一起读取 print(el) 运行结果: {'k1': 1} {'k2': 2} {'k3': 3}
- 解决方法2:改用
dumps
和loads
对每一行分别进行处理
import json lst = [{"k1": 1}, {"k2": 2}, {"k3": 3}] with open("text.txt", "w+", encoding="utf-8") as f: for el in lst: f.write(json.dumps(el)+"\n") # 利用write和dumps一行一行序列化写入 f.seek(0) for line in f: print(json.loads(line)) # 一行一行读取反序列化 运行结果: {'k1': 1} {'k2': 2} {'k3': 3}
2.pickle模块
pickle模块将所有数据类型和对象序列化转换成bytes类型(不支持lambda匿名函数),还可以反序列化还原回原数据,pickle模块只能在python语言中使用,其他语言不识别
pickle模块支持多行序列化写入和多行读取反序列化功能
pickle模块方法介绍:
pickle.dumps() 将对象序列化 pickle.loads() 将对象反序列化 pickle.dump() 将对象序列化写入文件 pickle.load() 将对象读取后反序列化 dumps、loads
:用于网络传输dump、load
:用于文件写读- pickle的方法和json完全相同,与json的区别就是pickle序列化后是字节,而json序列化后是字符串
3.shelve模块(了解)
- 了解一下就好,这里不做介绍
(二)hashlib模块
hashlib模块被人称为加密算法、摘要算法等,它的功能是用来对数据进行加密和文件校验使用,通过模块中的功能函数将数据转