一.json
所有的编程语言都能够识别的数据格式叫做json,是字符串
能够通过json序列化字符串与如下类型:(int float bool str list tuple dict None)
import json
1.json用法
(1)dumps 和 loads是一对,可以序列化成字符串
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)dump 和 load是一对,针对于文件,把数据序列化后存储文件
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)