0728Python总结-json模块,time模块,进度条效果,zipfile模块

一.json

所有的编程语言都能够识别的数据格式叫做json,是字符串
能够通过json序列化字符串与如下类型:(int float bool str list tuple dict None)

import json

1.json用法

(1)dumpsloads是一对,可以序列化成字符串

dic = {
    
    "name":"高云峰","age":81,"classroom":"python31","family":["老爸","老妈","老伴"]}
# ensure_ascii=False 显示中文 sort_key=True 对字典的键进行排序
res = json.dumps(dic, ensure_ascii=False, sort_keys=True)
print(res, type(res))  # {"age": 81, "classroom": "python31", "family": ["老爸", "老妈", "老伴"], "name": "高云峰"} <class 'str'>

# loads反序列化原来的数据类型
dic = json.loads(res)
print(dic, type(dic))  # {'age': 81, 'classroom': 'python31', 'family': ['老爸', '老妈', '老伴'], 'name': '高云峰'} <class 'dict'>

(2)dumpload是一对,针对于文件,把数据序列化后存储文件

dic = {
    
    "name":"高云峰","age":81,"classroom":"python31","family":["老爸","老妈","老伴"]}
with open("ceshi1.json", mode="w", encoding="utf-8") as fp:
    json.dump(dic, fp, ensure_ascii=False)

with open("ceshi1.json", mode="r", encoding="utf-8") as fp:
    dic = json.load(fp)
    print(dic, type(dic))
2.json 和 pickle 之间的区别

json
json可以连续dump,但是不能连续load

dic1 = {
    
    "a":1,"b":2}
dic2 = {
    
    "c":3,"d":4}
with open("ceshi2.json", mode="w", encoding="utf-8") as fp:
    json.dump(dic, fp)
    fp.write("\n")
    json.dump(dic2, fp)
    fp.write("\n")

load在获取数据时,是一次性拿取所有内容

# error
"""
with open("ceshi2.json", mode="r", encoding="utf-8") as fp:
    res = json.load(fp)
    print(res)
"""
# 解决办法
with open("ceshi2.json", mode="r", encoding="utf-8") as fp:
    for i in fp:
        dic = json.loads(i)
        print(dic, type(dic))

picklepickle
可以连续dump 也可以连续load 因为pickle在存储数据的时候会在末尾加上结束符

import pickle
dic1 = {
    
    "a":1, "b":2}
dic1 = {
    
    "c":3, "d":4}
with open("ceshi3.pkl", mode="wb") as fp:
    pickle.dump(dic1, fp)
    pickle.dump(dic2, fp)

with open("ceshi3.pkl", mode="rb") as fp:
    dic1 = pickle.load(fp)
    print(dic1, type(dic1))
    dic2 = pickle.load(fp)
    print(dic2, type(dic2))

try … except … 异常处理(用来抑制错误的)

try:
    可能报错的代码
except:
    如果报错执行except这个代码块
# 获取文件当中所有的数据
try:
    with open("ceshi3.pkl", mode="rb") as fp:
        while True:
            res = pickle.load(fp)
            print(res)
except:
    pass
json和pickle两个模块的区别:
(1)json序列化之后的数据类型是str,所有编程语言都识别
    但是仅限于(int float bool)(str list tuple dict None)
    json不能连续load,只能一次性拿出所有数据
(2)pickle序列化之后的数据类型是bytes
    所有数据类型都可转化,但仅限于Python之间的存储传输
    pickle可以连续load,多套数据放到同一个文件中
    
json使用的广泛性比pickle更强
json  用在不同编程语言的数据交流中
pickle用于数据的存储

二.time 时间模块

import time
localtime -> mktime -> ctime
时间元组 -> 时间戳 -> 时间字符串

time() 获取本地时间戳

localtime() 获取本地时间元组(参数是时间戳,默认当前)

mktime() 通过时间元组获取时间戳(参数是时间元组)

ttp = (2020,7,28,10,48,30,0,0,0)
res = time.mktime(ttp)
print(res)  # 1595904510.0

ctime() 获取本地时间字符串(参数是时间戳,默认当前)

res = time.ctime()  # 默认当前时间戳获取时间字符串
print(res)  # Tue Jul 28 18:23:06 2020
# 指定时间戳
res = time.ctime(1595904510)
print(res)  # Tue Jul 28 10:48:30 2020

asctime() 通过时间元组获取时间字符串(参数是时间元组)(了解)

ttp = (2020,7,28,10,54,30,6,0,0)  # 不能自动识别周几
res = time.asctime(ttp)
print(res)  # Sun Jul 28 10:54:30 2020

# 改造办法
ttp = (2020,7,28,10,54,30,0,0,0)
res = time.mktime(ttp)
str_time = time.ctime(res)
print(str_time)  # Tue Jul 28 10:54:30 2020

sleep() 程序睡眠等待

time.sleep(2)
print("我睡醒了")

strftime => 把时间元组 -> 时间字符串
strptime => 把时间字符串 -> 时间元组

strftime() 格式化时间字符串(格式化字符串,时间元组)

# 默认按照当前时间做格式化
res = time.strftime("%Y-%m-%d %H:%M:%S")
print(res)  # 2020-07-28 19:18:22

# 指定时间元组,对时间字符串格式化
"""strftime如果在Windows当中出现中文,直接报错,不能解析,Linux可以支持"""
ttp = (2000,10,1,12,12,12,0,0,0)
res = time.strftime("%Y-%m-%d %H:%M:%S", ttp)
print(res)  # 2000-10-01 12:12:12

striptime() 将时间字符串通过指定格式提取到时间元组中(时间字符串,格式化字符串)
要求字符串不能乱加符号,必须严丝合缝

strvar = "2020年7月28号11时12分13秒是著名歌星庾澄庆的生日"
ttp = time.strptime(strvar, "%Y年%m月%d号%H时%M分%S秒是著名歌星庾澄庆的生日")
print(ttp)  # time.struct_time(tm_year=2020, tm_mon=7, tm_mday=28, tm_hour=11, tm_min=12, tm_sec=13, tm_wday=1, tm_yday=210, tm_isdst=-1)

perf_counter() 用于计算程序运行的时间(了解)

# 记录开始时间
# startime = time.perf_counter()
starttime = time.time()

for i in range(100000000):
    pass

# 记录结束时间
endtime = time.perf_counter()
endtime = time.time()
print(endtime - starttime)
"""
%Y 年 year
%m 月 month
%d 日 day
%H 时 hour
%M 分 minute
%S 秒 second
"""

三.进度条效果

import time

# (1)定义进度条的样式
print("[%-50s]" % ("#"))
print("[%-50s]" % ("##########"))
print("[%-50s]" % ("#####################"))

# (2)让进度条动起来
"""
strvar = ""
for i in range(50):
    strvar += "#"
    time.sleep(0.1)
    print("\n[%-50s]" % (strvar), end="")
"""

# (3)根据文件的大小,调整进度条的位置
print("=========")
# 假设文件的大小是 1024000
def progess(percent):
    # 如果百分比超过了1,说明数据已经接受完毕
    if percent > 1:
        percent = 1

    # 打印对应的#号效果
    strvar = "#" * int(percent * 50)
    # %% => %
    print("\r[%-50s] %d%%" % (strvar, int(percent * 100)), end="")

# 初始化接收的字节数
recv_size = 0
# 文件接收总大小
total_size = 1024000
while recv_size < total_size:
    recv_size += 1024

    # 模拟延迟
    time.sleep(0.01)
    # 计算百分比
    percent = recv_size / total_size  # 0.01
    # 调整进度条
    progess(percent)

四.zipfile 压缩模块

import zipfile

1.压缩文件

(1)创建压缩包

zf = zipfile.ZipFile("1424.zip", "w", zipfile.ZIP_DEFLATED)

(2)把文件写入到压缩包

# write(路径,别名)
zf.write("/bin/cp", "cp")
zf.write("/bin/chmod", "chmod")
# 可以临时创建一个文件夹tmp在压缩包中
zf.write("/bin/df", "/tmp/df")

(3)关闭压缩包

zf.close()
2.解压文件

(1)打开压缩包

zf = zipfile.ZipFile("1424.zip", "r")

(2)解压文件

# 解压单个文件
zf.extract("cp", "ceshi1424_2")
# 解压所有文件
zf.extractall("ceshi1424")

(3)关闭压缩包=

zf.close()
3.追加文件(支持with语法)
with zipfile.ZipFile("1424.zip", "a", zipfile.ZIP_DEFLATED) as zf:
    zf.write("/bin/dir", "dir")
4.查看压缩包
with zipfile.ZipFile("1424.zip", "r", zipfile.ZIP_DEFLATED) as zf:
    lst = zf.namelist()
    print(lst)

猜你喜欢

转载自blog.csdn.net/qq_45957580/article/details/107645170