前奏
l1 = [1, 2, 3]
ret = str(l1)
print(ret,type(ret))
print(eval(ret)) 不让用
文件存取时,遇到的矛盾.
dic ={'username': '太白', 'password': 123}
dic = {1: {'username': '太白', 'password': 123,'status': False},
2:{'username': 'alex', 'password': 123,'status': False}}
这个字典能放在全局么?
with open('register.json',encoding='utf-8',mode='w') as f1:
f1.write(str(dic))
with open('register',encoding='utf-8') as f1:
ret = f1.read()
print(ret,type(ret))
数据结构 --- > str() 字符串形式存储在文件当中, 读取出来时,反转不回去.
网络传输.(凡是数据通过网络传出去最终的格式必须bytes)
l1 = [i for i in range(100000)]
凡是数据通过网络传出去最终的格式必须bytes
s1 = str(l1)
b1 = s1.encode('utf-8')
print(b1) b1可以发送出去
s2 = b1.decode('utf-8')
print(s2,type(s2))
s2 转化不成列表了.
我们现在要解决的问题: 如果有一种特殊的字符串,这个字符串可以与任何的数据结构互相转换.
序列化模块(序列化模块: 将一中数据结构转化成特殊的序列(特殊的字符串,bytes)并且还可以反转回去.)
将一个数据结构(list,dict....)转化成一个特殊的序列(特殊的字符串)的过程.
json模块:json模块: 是所有语言公认的一种序列.最最常用的所以支持的python数据结构有限: int str bool dict list(tuple),None,float
两对四个方法:
dumps,loads 主要用于网络传输,可以用于文件的存取.
import json
dumps,loads 主要用于网络传输,可以用于文件的存取.
dic = {'username': '太白', 'password': 123,'status': False}
ret = json.dumps(dic)
print(ret,type(ret))
ret_dict = json.loads(ret)
print(ret_dict)
特殊的参数
dic = {'username': '太白', 'password': 123,'status': False}
print(dic)
ret = json.dumps(dic,ensure_ascii=False,sort_keys=True)
print(ret,type(ret))
import json
dic = {'username': '太白', 'password': 123,'status': False}
s_dict = json.dumps(dic)
with open('jsonlx.json',encoding='utf-8',mode='w') as f1:
f1.write(s_dict)
with open('jsonlx.json',encoding='utf-8') as f2:
content = f2.read()
print(json.loads(content))
dump load: 单个数据的存取文件.
dump load: 单个数据的存取文件.
import json
dic = {'username': '太白', 'password': 123,'status': False}
with open('jsonlx1.json',encoding='utf-8',mode='w') as f1:
json.dump(dic,f1)
with open('jsonlx1.json',encoding='utf-8') as f1:
dic1 = json.load(f1)
print(dic1,type(dic1))
多个数据如何存储到一个文件中?
多个数据如何存储到一个文件中?
错误演示:
import json
dic1 = {'username': '太白', 'password': 123,'status': False}
dic2 = {'username': 'alex', 'password': 123,'status': False}
dic3 = {'username': 'ly', 'password': 123,'status': False}
with open('jsonmore.json',encoding='utf-8',mode='a') as f1:
f1.write(json.dumps(dic1))
f1.write(json.dumps(dic2))
f1.write(json.dumps(dic3))
f1.write(f'{json.dumps(dic1)}{json.dumps(dic2)}{json.dumps(dic3)}')
with open('jsonmore.json',encoding='utf-8') as f1:
ret = json.loads(f1.read())
print(ret)
正确做法:
import json
dic1 = {'username': '太白', 'password': 123,'status': False}
dic2 = {'username': 'alex', 'password': 123,'status': False}
dic3 = {'username': 'ly', 'password': 123,'status': False}
with open('jsonmore.json',encoding='utf-8',mode='a') as f1:
f1.write(f'{json.dumps(dic1)}\n{json.dumps(dic2)}\n{json.dumps(dic3)}')
with open('jsonmore.json',encoding='utf-8') as f1:
for line in f1:
ret = json.loads(line)
print(ret,type(ret))
pickle模块:pickle模块: 只能python语言中使用的,序列化模块:支持python所有的数据类型以及对象.
dumps,loads 只能是网络传输
l1 = ['wusir', '太白', '小黑', 666]
ret = pickle.dumps(l1)
print(ret)
l2 = pickle.loads(ret)
print(l2,type(l2))
dump load 数据结构存取文件.
dump load 数据结构存取文件.
import pickle
l1 = ['wusir', '太白', '小黑', 666]
with open('pickle练习.pickle',mode='wb') as f1:
pickle.dump(l1,f1)
with open('pickle练习.pickle', mode='rb') as f1:
ret = pickle.load(f1)
print(ret,type(ret))
多个数据写入文件
l1 = ['wusir', '太白', '小黑1', 666]
l2 = ['wusir', '太白', '小黑2', 666]
l3 = ['wusir', '太白', '小黑3', 666]
with open('pickle练习1.pickle',mode='wb') as f1:
pickle.dump(l1,f1)
pickle.dump(l2,f1)
pickle.dump(l3,f1)
with open('pickle练习1.pickle', mode='rb') as f1:
ret1 = pickle.load(f1)
ret2 = pickle.load(f1)
ret3 = pickle.load(f1)
print(ret1,ret2,ret3)
shevle模块(只能是文件存取)
os模块
目录:文件夹
工作目录,当前目录,父级目录: day17
import os
print(os.getcwd()) D:\s23\day17 绝对路径 ***
os.chdir(r'D:\s23\day9')
print(os.getcwd())
print(os.curdir)
print(os.pardir)
h和文件相关的
import os
os.makedirs('dirname1/dirname2/dirname3/dirname4') 多级目录
os.removedirs('dirname1/dirname2/dirname3/dirname4') 截止到有文件的那层
os.mkdir(r'd:\abc') 单级目录
os.rmdir('abc')
print(os.listdir(r'D:\s23\day15'))
os.remove() 删除一个文件 ***
os.rename("oldname","newname") 重命名文件/目录 ***
print(os.stat(r'D:\s23\day17\01 昨日内容回顾.py'))
path 和路径相关
path 和路径相关 ***
print(os.path.abspath('04 os模块.py')) D:\s23\day17\01 昨日内容回顾.py
print(os.path.split(os.path.abspath('01 昨日内容回顾.py'))) ('D:\\s23\\day17', '01 昨日内容回顾.py')
print(os.path.dirname(r'D:\s23\day9\01 初始函数.py')) 获取父级目录
print(os.path.dirname(os.path.abspath('01 昨日内容回顾.py')))
print(__file__) 动态获取当前文件的绝对路径
获取当前文件的爷爷级的目录
print(os.path.dirname(os.path.dirname(__file__)))
print(os.path.basename(r'D:\s23\day9\01 初始函数.py')) 获取文件名
print(os.path.exists(r'D:\s23\day9\02 初始函数.py'))
判断是否是绝对路径
print(os.path.isabs(r'D:\s23\day9\01 初始函数.py'))
print(os.path.isabs(r'day17/01 昨日内容回顾.py'))
判断该路径是否是一个文件路径
print(os.path.isfile(r'D:\s23\day9\01 初始函数.py'))
print(os.path.isfile(r'D:\s23\day9'))
print(os.path.isdir(r'D:\s23\day17\dirname1\dirname2'))
print(os.path.exists(r'D:\s23\day17\dirname1\dirname2'))
判断是否是一个目录(文件夹)
print(os.path.isdir(r'D:\s23\day17\02 序列化模块.py'))
D:\s23\day16\评论文章
path = os.path.join('D:','s23','day20','随便')
print(path)
par_dir = os.path.dirname(__file__)
print(par_dir) D:/s23/day17
path = r'D:\s23\day17\db\lydata'
path = par_dir + '\db' +'\lydata'
path = os.path.join(par_dir,'db','lydata')
with open(path,encoding='utf-8',mode='a') as f1:
f1.write('李业在红浪漫消费998元')
print(os.path.getatime('D:\s23\day17\db\lydata'))
print(os.path.getmtime('D:\s23\day17\db\lydata'))
print(os.path.getsize('D:\s23\day17\db\lydata'))
print(os.stat(r'D:\s23\day17\01 昨日内容回顾.py'))
sys模块(sys.path )
import sys
sys.path ***
print(sys.version) 版本
for i in range(3):
print(i)
exit() 强制退出
quit()
for i in range(5):
print(i)
print(sys.platform)
hashlib模块
加密模块, 摘要算法,散列算法,等等.它是一堆加密算法的集合.
liye|zmdsb
太白|123
明文形式存储的,带来安全隐患
hashlib如何加密?
1. 将一个bytes类型的数据 通过hashlib进行加密返回 一个等长度的16进制数字.
2. 过程不可逆.
3. 相同的bytes类型的数据通过相同的加密方法得到的数字绝对相同.
4. 不相同的bytes类型的数据通过相同的加密方法得到的数字绝对不相同.
撞库(相较简单的密码)
hashlib用途
1. 密码加密.
2. 文件一致性校验.
密码加密
密码加密
md5
ret = hashlib.md5()
ret.update('123'.encode('utf-8'))
s = ret.hexdigest()
print(s,type(s))
ret = hashlib.md5()
ret.update('123'.encode('utf-8'))
s = ret.hexdigest()
print(s,type(s))
ret = hashlib.md5()
ret.update('223'.encode('utf-8'))
s = ret.hexdigest()
print(s,type(s))
ret = hashlib.md5()
ret.update('22fdslkafjdsklfdsjalfaklfjdslkfjdslkfjdsalf;dsajkfldsjf3'.encode('utf-8'))
s = ret.hexdigest()
print(s,type(s))
撞库
ret = hashlib.md5()
ret.update('123456*@qwe'.encode('utf-8'))
s = ret.hexdigest()
print(s,type(s))
加固定盐
ret = hashlib.md5('xxx教育'.encode('utf-8'))
ret.update('123456'.encode('utf-8'))
s = ret.hexdigest()
print(s,type(s))
加动态的盐
username = input('输入用户名:').strip()
password = input('输入密码').strip()
ret = hashlib.md5(username[::2].encode('utf-8'))
ret.update(password.encode('utf-8'))
s = ret.hexdigest()
print(s)
sha系列: 安全系数高,耗时高.
加盐,加动态盐
ret = hashlib.sha512()
ret.update('123456fdklsajflsdfjsdlkafjafkl'.encode('utf-8'))
s = ret.hexdigest()
print(s,type(s))
文件的一致性校验:
low版
import hashlib
ret = hashlib.md5()
with open('MD5文件校验',mode='rb') as f1:
content = f1.read()
ret.update(content)
print(ret.hexdigest())
ret = hashlib.md5()
with open('MD5文件校验1',mode='rb') as f1:
content = f1.read()
ret.update(content)
print(ret.hexdigest())
ret = hashlib.md5()
with open(r'D:\s23\day17\python-3.7.4rc1-embed-win32.zip',mode='rb') as f1:
content = f1.read()
ret.update(content)
print(ret.hexdigest())
d9c18c989c474c7629121c9d59cc429e
d9c18c989c474c7629121c9d59cc429e
分布update
```
s1 = ‘老男孩教育 最好的python 讲师 是 太白‘
1
ret = hashlib.md5()
ret.update(s1.encode(‘utf-8‘))
print(ret.hexdigest())
2
ret = hashlib.md5()
ret.update(‘老男孩教育‘.encode(‘utf-8‘))
ret.update(‘ 最好的python‘.encode(‘utf-8‘))
ret.update(‘ 讲师 是‘.encode(‘utf-8‘))
ret.update(‘ 太白‘.encode(‘utf-8‘))
print(ret.hexdigest()) 90c56d265a363292ec70c7074798c913
高达上版
import hashlib
def md5_file(path):
ret = hashlib.md5()
with open(path,mode=‘rb‘) as f1:
while 1:
content = f1.read(1024)
if content:
ret.update(content)
else:
return ret.hexdigest()
print(md5_file(r‘D:\s23\day17\python-3.7.4rc1-embed-win32.zip‘))
原文:https://www.cnblogs.com/-777/p/11099317.html