序列化与反序列化
1、什么是序列化与反序列化
序列化就是将内存中的数据结构转换成一种中间格式存储到硬盘或者基于网络传输 反序列化就是硬盘中或者网络中传来的一种数据格式转换成内存中数据结构
2、 为什么要有?
1、可以保存程序的运行状态 2、数据的跨平台交互
json注意点:
json格式不能识别单引号,全都是双引号
优点: 跨平台性强 缺点: 只能支持/对应python部分的数据类型
用json反序列化
with open('db.json','rt',encoding='utf-8') as f:
l=json.load(f)
print(l)
用eval反序列化
with open('db.json','rt',encoding='utf-8') as f:
s=f.read() #s='[l,true,null]'
dic=eval(s) #eval('[l,true,null]')
print(dic['name'])
json的反序列化
# 导入模块
import json
反序列化:中间格式json----》内存中的数据类型
1.从文件中读取json_str
with open('db.jsnon','rt',encoding='utf-8') as f:
json_str=f.read()
2.将json_str转成内存中的数据类型
dic=json.loads(json_str)
将以上1和2步骤合为一步
with open('db.json','rt',encoding='utf-8') as f:
dic=json.load(f)
print(dic['sex'])
json的序列化
import json
dic={'name':'egon','age':18,'sex','male'}
序列化:内存中的数据类型----->中间格式json
1.序列化得到json_str
json_str=json.dumps(dic)
2.把json_str写入文件
with open('db.jsnon','wt',encoding='utf-8') as f:
json.dump(dic,f)
以上两步合为一步
with open('db,json','wt',encoding='utf-8') as f:
json.dump(dic,f)
print(json_str,type(json_str)) # json格式不能识别单引号,全都是双引号
pickle反序列化
import pickle
1.从文件中读取pickle格式
with open('db.pkl','rb') as f:
pk1=f.read()
2.将json_str转成内存中的数据类型
dic=pickle.loads(pkl)
print(dic['a'])
以上两步可合为一步:
with open ('db.pkl','rb') as f:
dic=pickle.load(f)print(dic['a'])
pickle序列化
import pickle
dic={'1':1,'b':2},'c':3
1.序列化
pkl=pickle.dumps(dic)
print(pkl,type(pkl))
2.写入文件
with open('db.pkl','wb') as f:
f.write(pkl)
1和2可以合作一步
with open('db.pkl','wb') as f:
pickle.dump(dic,f)
02 时间模块
import time
时间分为三种格式
1.时间戳
start=time.time()
time.sleep(3)
stop=time.time()
rint(stop - start)
2.格式化的字符串形成
print(time.strftime('%Y-%m-%d %X')) #%Y为年 %m为月 %d日 %X当前时间
print(time.strftime('%Y-%m-%d %H:%M:%S %p') # %H:%M:%S为时 分 秒 %p为AM或者MP
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)) #从1970年00:00:00开始偏移(以秒偏移)
# 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))结果:2020-06-20 16:33:58.936918
03 随机值random模块
import random
# print(random.random())
# print(random.randint(1,3))
# print(random.randrange(1,3))
# print(random.choice([1,'egon',[1,2]]))
# print(random.sample([1, 'aa', [4, 5]], 2))
# print(random.uniform(1,3))
# item=['a','b','c','d']
# random.shuffle(item)
# print(item)
04 os模块
import os
# print(os.getcwd()) # 获取当前工作目录,即当前python脚本工作的目录路径
# print(os.listdir(r'D:\s2视频目录\day18')) # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
# print(os.listdir('.'))
# print(os.listdir('..'))
# os.chdir(r'D:\s2视频目录\day08') # 返回当前目录: ('.')
# print(os.getcwd())
# print(os.listdir(r'D:\s2视频目录\day08'))
# print(os.listdir(r'.'))
# os.mkdir(r'a') # 生成单级目录;相当于shell中mkdir dirname
# os.mkdir(r'a/b')
# os.mkdir(r'a/b/c')
# os.makedirs(r'a\b\c\d\e\f') # 可生成多层递归目录
# os.rmdir(r'a\b\c\d\e\f')
# os.removedirs(r'a\b\c\d\e\f')
# obj=os.stat(r'D:\s2视频目录\day18\run.py') # 获取文件/目录信息
# print(obj)
# print(os.sep)
# print(os.linesep)
# print(os.pathsep)
# import time,os
# print(os.getpid())
# time.sleep(500)
# res=os.system('taskliasdfst')
# print('结果是:',res)
# import json
# 当程序所有的文件都需要引用一个变量时,则需要将该变量加入环境变量中
# os.environ['x']=json.dumps(['a','b','c'])
# print(json.loads(os.environ['x'])[0])
# print(os.path.split(r'D:\s2视频目录\day18\03 random模块.py'))
# print(os.path.dirname(r'D:\s2视频目录\day18\03 random模块.py'))
# print(os.path.basename(r'D:\s2视频目录\day18\03 random模块.py'))
# print(os.path.isabs(r'C:\a\b.txt'))
# print(os.path.isabs(r'a\b.txt'))
# print(os.path.isabs('/a/b/c.txt'))
# print(os.path.isabs('a/b/c.txt'))
# print(os.path.join('C:\\','a','D:\\','b','F:\\','c.txt'))
print(os.path.getsize(r'D:\s2视频目录\day18\02 时间模块.py')) #字节