1.序列化模块: pickle 和 json
1.1 序列化模块(bytes):pickle
"""
序列化: 把不能够直接存储的文件中的数据变得可存储
反序列化:把存储的数据拿出来恢复成原来的数据类型
其他语言写法:
序列化: serialize
反序列化:unserialize
"""
import pickle #引入模块
# 1.dumps() 把任意对象序列化成一个字节流(bytes)
def func():
print("12代付款")
res=pickle.dumps(func)# 把函数序列化
# 2.loads() 把任意字节流(bytes)反序列化成原来的数据类型
func1=pickle.loads(res)
func1()
# 3.dump(a,fp) 把a对象序列化后写入到文件对象fp中
lst=[11,22,33]
with open("1",mode="wb")as fp:
pickle.dump(lst,fp)
# 4.load(fp) 把文件对象中的内容拿出来,反序列化成原来的数据类型
with open("1",mode="rb")as fp:
res=pickle.load(fp)
print(res)
1.2 序列化模块(str): json
"""
所有编程语言都能识别的数据格式叫json,是字符串
能够转化的数据类型:
int float bool str list tuple dict None (没有复数和集合)
"""
import json
# 1.dumps 把对象序列化成一个str
"""
参数:
ensure_ascii=False 显示中文
sort_keys=True 对字典的键进行排序
"""
dic={"bb":"熊大","aa":"熊二"}
res=json.dumps(dic) #不能显示中文
print(res)
res=json.dumps(dic,ensure_ascii=False)#可以显示中文
print(res)
# 2.loads 把任意str反序列成原来的数据类型
res=json.loads(res)
print(res,type(res)) #字典类型
# 3.dump(a,fp) 把a对象序列化或写入到文件对象fp中
with open("2",mode="w",encoding="utf-8")as fp:
json.dump(dic,fp,ensure_ascii=False)
# 4.load 把文件对象中的内容拿出来,反序列化成原来的数据类型
"""
仅限文件有且只有一个数据时,多个数据报错
"""
with open("2",mode="r",encoding="utf-8")as fp:
res=json.load(fp)
print(res,type(res)) #字典类型
1.3 json 和 pickle 的区别
"""
json:
序列化之后的类型是str,所有编程语言都能识别,一般做数据传输
可以序列化的类型: int float bool str list tuple dict None
json可以连续dump,但不能连续的load,只能一次性拿去所有数据
pickle:
序列化之后的类型是bytes,仅限于Python之间的存储传输
所有数据类型都可以转化
pickle可以连续dump,也可以连续load,多个数据放在同一文件中也能读取
"""
# 1.json
import json
dic={"aa":"光头强","bb":22}
lst=[1,2,3,4,5]
# 序列化到文件,连续dump,数据之间需要换行
with open("3",mode="w",encoding="utf-8")as fp:
json.dump(dic,fp,ensure_ascii=False)
fp.write("\n") #换行,在一行只能有一个数据,否则不能反序列化
json.dump(lst,fp)
# 反序列化读取文件
"""
with open("3",mode="r",encoding="utf-8")as fp:
res=json.load(fp)
print(res)
报错,load只能读取只有一个数据的文件
"""
# 解决办法: 遍历文件,用loads反序列化对象
with open("3",mode="r",encoding="utf-8")as fp:
for i in fp:
res=json.loads(i)
print(res)
# 2.pickle
import pickle
dic={"aa":"光头强","bb":22}
lst=[1,2,3,4,5]
# 序列化到文件,连续dump,数据之间随意,可以不换行
with open("4",mode="wb")as fp:
pickle.dump(dic,fp)
pickle.dump(lst,fp)
# 连续load
with open("4",mode="rb")as fp:
res1=pickle.load(fp)
res2=pickle.load(fp)
print(res1,res2)
# 一次性把所有数据都拿出来
"""
with open("4",mode="rb")as fp:
while True:
res=pickle.load(fp)
print(res)
会报错,Ran out of input 不能load空
"""
# 异常处理的使用
"""
try ... except...
把有问题的代码写在try代码块中,如果报错执行except
作用:
抑制错误,不会导致程序中断
"""
with open("4",mode="rb")as fp:
try:
while True:
res=pickle.load(fp)
print(res)
except:
pass
2.时间模块: time
import time
# 1.time 获取本地时间戳
print(time.time())
# 2.localtime 获取本地时间元组
"""
参数:(时间戳) 默认当前时间
时间元组:(年,月,日,时,分,秒,星期,一年中第几天,是否是夏令时)
"""
print(time.localtime())
print(time.localtime(1607000000)) #指定时间戳
# 3.mktime 通过时间元组获取时间戳(参数是时间元组)
ttp=(2020,11,6,11,44,55,0,0,0)
print(time.mktime(ttp))
# 4.ctime 获取本地时间字符串(参数是时间戳)默认当前时间
print(time.ctime())
print(time.ctime(1607000000)) #指定时间戳
# 5.asctime 通过时间元组获取字符串
ttp=(2020,11,6,11,44,55,0,0,0)
print(time.asctime(ttp))
"""
不能自动识别星期,
解决办法: 先mktime变成时间戳,再ctime变成字符串
"""
res=time.mktime(ttp)
res1=time.ctime(res)
print(res1)
# 6.sleep 程序睡眠等待时间(秒)
time.sleep(1) #1秒后打印
print("好好")
# 7.strftime 格式化时间字符串
"""
参数:(格式化时间字符串,时间元组) 时间元组默认当前时间
"""
res=time.strftime("当前时间:%Y-%m-%d %H:%M:%S")
print(res)
ttp=(2020,11,6,11,44,55,0,0,0)
res=time.strftime("时间:%Y-%m-%d %H:%M:%S",ttp)#指定元组
print(res)
# 8.strptime 将时间字符串通过指定格式提取到时间元组中
"""
参数:
(原时间字符串,格式化字符串)
两者必须严丝合缝,不能随便更改,否则报错
"""
str1="1987年12月1日13时30分30秒"
str2="%Y年%m月%d日%H时%M分%S秒"
res=time.strptime(str1,str2)
print(res)
# 9,perf_counter 用于计算程序运行时间
res1=time.perf_counter()#time.time()也可以
for i in range(10000000):
pass
res2=time.perf_counter()
print("程序运行时间{}".format(res2-res1))
# 进度条
import time
def func(n):#传入百分比
if n>1:
n=1
strvar=int(50*n)*"#"
print("\r[%-50s]%d%%"%(strvar,n*100),end="")
data=0
total=1111 #文件总大小
while data<total:
time.sleep(0.1)
data+=100 #文件传输速度
n=data/total #占总文件大小比例
func(n)
3.压缩模块: zipfile
# 压缩模块:zipfile(后缀为zip)
"""
zipfile.ZipFile(file,mode,compression,allowZip64)
功能:创建一个ZipFile对象,表示一个zip文件
参数:
file: 表示文件的路径或类文件对象
mode: 指定打开文件模式,(默认值为 r )
r ->代表读取已经存在的zip压缩文件
w->代表新建(或覆盖)一个zip压缩文件
a ->代表将数据追加到一个已经存在的zip压缩文件中
compression: 表示压缩文件时的压缩方法
zipfile.ZIP_STORED ->只储存,不压缩,默认该模式
zipfile.ZIP_DEFLATED->对文件进行压缩
allowZip64: 如果需要压缩的文件超过2G,应该将该参数设为True
"""
import zipfile
# 1.创建压缩文件
"""
1.ZipFile() 写模式w打开或者新建压缩文件
2.write(路径,别名) 向压缩文件中添加文件内容
3.close() 关闭压缩文件
"""
zf=zipfile.ZipFile("1.zip","w",zipfile.ZIP_DEFLATED)
zf.write("/bin/bash","bash")
zf.close()
# 支持with...as..语法,不需要手动close关闭文件
with zipfile.ZipFile("1.zip","w",zipfile.ZIP_DEFLATED)as zf:
zf.write("/bin/bash","bash")
# 2.解压文件
"""
1.ZipFile() 读模式r打开压缩文件
2.extractall(路径) 解压所有文件到某个路径下
extract(文件,路径) 解压指定的某个文件到某个路径下
3.close() 关闭压缩文件
"""
with zipfile.ZipFile("1.zip")as zf: #默认模式为r
zf.extractall("/home/jyh/aa")
# 3.向压缩文件中追加文件
with zipfile.ZipFile("1.zip","a",zipfile.ZIP_DEFLATED)as zf:
zf.write("/bin/cat","cat")
# 4.查看压缩文件:namelist() 返回列表
with zipfile.ZipFile("1.zip")as zf:
res=zf.namelist()
print(res)