一,序列化
将列表,字典数据类型的内容转化为字符串类型的整个过程就叫做序列化
序列化的目的:
1,以某种形式使自定义对象(数据)持久化
2,将对象从一个地方传递到另一个地方
3,使程序更具有维护性
序列化----json模块:
json模块提供四个功能:dumps,loads,dump,load
dumps:将字典,列表的数据序列化为str数据类型【序列化中文必须指定不适用ascii码】
loads:将str数据类型的数据反序列化为字典,列表
dump:将字典,列表的数据序列化并且存入文件中
load:将文件中的str数据反序列化为字典,列表并返回
import json k = {'username':'Bob','age':17} s = json.dumps(k) # 序列化字典,将字典序列化为str类型 print(s,type(s)) s1 = json.loads(s) # 反序列化str,将str转化为字典 print(s1,type(s1)) lis = [1,2,3,4,5] x = json.dumps(lis) # 将列表序列化为str y = json.loads(x) # 将str数据反序列化为列表 print(y,type(y))
import json f = open('json_file','w') dic = {'username':'barry','age':25} json.dump(dic,f) # 将字典序列化为字符串并传入文件 f.close() f = open('json_file') dic2 = json.load(f) # 将文件中的字符串反序列化为字典取出 print(dic2,type(dic2)) f.close()
import json l = [1,[1,2,3,4],2,{'username':'alex','age':18}] s2 = json.dumps(l) print(s2,type(s2)) l1 = json.loads(s2) print(l1,type(l1))
print(json.dumps('中国',ensure_ascii=False)) # 序列化中文的时候,必须指定不适用ascii编码
import json data = {'username':['李华','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) print(json_dic2)
序列化----pickle模块
和json模块基本一样,区别是:json模块是把字典,列表数据序列化为str;pickle是把任意数据类型的数据序列化为二进制内容
那么为什么不直接使用pickle呢?
pickle是python专属的模块,存在局限性;而json是通用的,在java,c,c++中都可以使用
三,random模块
random模块:随机返回数字。 应用场景:验证码的下发
import random # 随机小数 print(random.random()) # 随机返回一个0-1之间的小数 print(random.uniform(1,10)) # 随即返回一个范围内的小数
import random # 随机整数 print(random.randint(1,10)) # 随机返回范围内的一个整数(左右两边最大最小值都可以被随机到) print(random.randrange(1,20,2)) # 增加步长概念,返回范围内奇数
# 随机选择返回一个选择 print(random.choice([1,2,3,4,5,6])) # 随机返回列表或元组中的一个元素【仅限列表和元组】 print(random.sample([1,2,3,4,5,6,7,8],3)) # 随机返回列表或元祖中的n个元素,并组成列表【n可以自定义】
import random # 打乱列表顺序 l = [1,2,3,4,5,6] random.shuffle(l) # 打乱列表中的字符顺序【仅限列表】 print(l)
import random def v_code(): code = '' for i in range(5): num = random.randint(0, 9) # 获取0-9之间一个任意的数字(整形) alf = chr(random.randint(65, 90)) # 获取65-90之间一个任意的数字,然后转化成ascii码对应的内容 add = random.choice([num, alf]) # 从num-alf之间获取一个任意的字符 code = "".join([code, str(add)]) # 拼接字符串(5次),最后形成一个5个字符长度的验证码 return code print(v_code())
随机生成验证码提出一个方法:chr 他的作用是把你给他的字符按照ascii码中对应的内容返回
四,os模块
os模块是与操作系统交互的接口
os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell命令,获取执行结果 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.path os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小
stat 结构: st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的链接数。 st_uid: 所有者的用户ID。 st_gid: 所有者的组ID。 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n" os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
五,sys模块
sys模块是与python解释器交互的接口
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称
import sys try: sys.exit(1) except SystemExit as e: print(e)