欢迎来到十九分快乐的博客

生死看淡,不服就干。

15.序列化模块-时间模块-zip压缩模块

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)
posted @ 2020-12-09 23:27  十九分快乐  阅读(58)  评论(0编辑  收藏  举报