jason序列化与反序列化
01.什么是序列化/反序列化
序列化就是将内存中的数据结构换成一种中间格式存储到硬盘或者基于网络传输
反序列化就是硬盘中或者网络中传来的一种数据格式转化成内存中的数据结构
02.为什么要有
1、可以保存程序的运行状态
2、数据的跨平台交互
03 怎么用
json:
优点:跨平台性强
缺点:只能支持/对应python部分的数据类型
pickle只能被python识别
# 序列化 import json dic={'name':'egon','age':18,'sex':'male'} with open('db.json','wt',encoding='utf-8')as f: json.dump(dic,f) #反序列化 import json with open('db.json','rt',encoding='utf-8')as f: dic=json.load(f) print(dic['sex'])
pickle 模块的用法与 json 一模一样
json补充
json格式不能识别单引号,全都是双引号
import json with open('db1.json','rt',encoding='utf-8') as f: json.load(f) json.loads('{"name":"egon"}') import json print(json.loads("{'name':'egon'}")) #会报错,json文件里不存在单引号。反序列化对象里面不能有单引号 with open('db.json','wt',encoding='utf-8') as f: l=[1,True,None] json.dump(l,f) # 用json反序列化 with open('db.json','rt',encoding='utf-8') as f: l=json.load(f) print(l) # 用eval反序列化:eval只是单纯的将文件里的字符串运行变成对应的数据类型,而不会把json文件里卖弄的true,null转换成True,None with open('db.json','rt',encoding='utf-8') as f: s=f.read() #s ='[1, true, null]' dic=eval(s) #eval('[1, true, null]') print(dic['name'])
pickle序列化
import pickle
dic={'a':1,'b':2,'c':3}
with open('db.pkl','wb') as f:
pickle.dump(dic,f)
pickle反序列化
import pickle with open('db.pkl','rb') as f: dic=pickle.load(f) print(dic)
time模块
import time # 时间分为三种格式 #1、时间戳 start= time.time() time.sleep(3) stop= time.time() print(stop - start) #2、格式化的字符串形式 print(time.strftime('%Y-%m-%d %X')) print(time.strftime('%Y-%m-%d %H:%M:%S %p')) #3、 结构化的时间/时间对象 # t1=time.localtime() # print(t1) # print(type(t1.tm_min)) # print(t1.tm_mday) #通过对象里的属性可以直接进行取值 # t2=time.gmtime() # print(t1) # print(t2)
时间转换 print(time.localtime(123123123)) print(time.gmtime(123123123)) print(time.mktime(time.localtime())) print(time.strftime('%Y',time.localtime())) print(time.strptime('2011-03-07','%Y-%d-%m')) print(time.asctime()) print(time.ctime()) print(time.strftime('%a %b %d %H:%M:%S %Y')) print(time.asctime(time.localtime())) print(time.ctime(123123123)) print(time.strftime('%Y-%m-%d %X')) 获取格式化字符串形式的时间麻烦 时间戳与格式化时间之间的转换麻烦 获取之前或者未来的时间麻烦 import datetime print(datetime.datetime.now()) print(datetime.datetime.fromtimestamp(1231233213)) print(datetime.datetime.now() + datetime.timedelta(days=3)) print(datetime.datetime.now() + datetime.timedelta(days=-3)) s=datetime.datetime.now() print(s.replace(year=2020))
random模块
import random print(random.random())#(0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3)) #[1,3] 大于等于1且小于等于3之间的整数 print(random.randrange(1,3)) #[1,3) 大于等于1且小于3之间的整数 print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5] print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合 print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 item=[1,3,5,7,9] random.shuffle(item) #打乱item的顺序,相当于"洗牌" print(item)
os模块(有时间自己敲一遍)
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') 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.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" " os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' os.system("bash command") 运行shell命令,直接显示 os.environ 获取系统环境变量 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的大小