在学习python中的经验和想法分享出来,希望可以抛砖引玉
json模块:将数据转换成数据,用于存储或网络传输
学习json模块你需要先理解序列化和反序列化过程
序列化:将内存中的数据转换成字节永久保存在文件或通过网络传输。
反序列化:从文件中、网络中获取的数据转换成内存中原来的数据。
这句话可能对于初学者确实会有点绕,慢慢随着自己的知识不断地积累,你就会明白了。
dumps 和 dump
序列化
s = json.dumps([1,2,3]) #把指定对象转换成json格式的字符串
print(type(s)) #<class 'str'>
print(s) #'[1,2,3]'
#将json结果写到文件中
with open('a.txt',mode = 'at',encoding='utf-8') as f:
json.dump([1,2,3],f)
loads 与 load
反序列化
反序列化的前提是序列化,才能有反序列化就像下面这样
res = json.dumps([1,2,3])#序列化
les = json.loads(res) #反序列化
print(type(les)) #<class 'list'>
print(les) #[1, 2, 3]
本来在序列化后进行反序列化,得到的结果应该与序列化之前保持一致,可是事实不是这样,下面我拿元组进行举例,其他的数据类型读者就可以自己进行测试,激发式学习会比直接塞给你效果会更好
# 元组序列化后反序列化会成为列表
res = json.dumps((1,2,3)) #元组进行序列化
les = json.loads(res) #反序列化
print(type(les)) #<class 'list'>
print(les) #[1, 2, 3]
#从文件中反序列化
with open('a.txt',encoding='utf-8') as f: #将刚序列化写入文件中的内容反序列化
res = json.load(f)
print(type(res)) #<class 'list'>
print(res) #[1,2,3]
json 模块常用的四个方法
json.dumps(obj) 序列化到内存中
json.dump(obj,f)序列化到文件中
json.loads(obj)在内存中有一个json字符串,反序列化
json.load(obj,f)对文件中进行反序列化
这个可以配合文件操作将用户注册的账号与密码以字符串的方式放在文件中永久保存。并且补充:json文件通常是一次性写,一次性读
pickle模块
pickle模块和json模块大致一样 ,常用的也是这四个用法也一样dumps和dump、loads与load
dumps 和 dump loads和load
序列化–这次序列化后就是你基本看不懂得二进制编码了
bys = pickle.dumps([1,2,3])
print(type(bys)) #<class 'bytes'>
print(bys)#b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03e.'
# 所有的数据类型都可进行序列化,且序列化后再非序列化不会改变本身的类型
bys =pickle.dumps((1,2,3))
print(bys)
res = pickle.loads((bys))
print(type(res))#<class 'tuple'>
print(res)#(1, 2, 3)
#把pikele序列化内容写入到文件中
with open('c.txt',mode='ab') as f:
pickle.dump([1,2,3],f)
#从文件中反序列化pickle数据
with open('c.txt',mode='rb') as f:
for x in range(4):
res = pickle.load(f)
print(res)
没有比较就没有伤害,现在让我们来对比一下json与pickle模块
json | pickle |
---|---|
不是所有类型数据类型都可以序列化字符串 | 所有python类型都能喝序列化,结果为字节 |
不能多次对同一个文件序列化 | 可以多次对同一个文件进行序列化 |
json数据可以跨语言读取 | 不能跨语言使用 |
hashlib模块
封装一些用于加密的类
加密目的是为了用于判断和验证,而非解密。
特点:
把一个大的数据,切分成不同的小块,分别对不同的块进行加密,再汇总的结果,和直接对整体数据加密的结果是一致的。
单项加密且不可逆
原始数据的一点小的变化,将导致结果的‘雪崩’似差异-------类似于牵一发而动全身
md5的加密算法
给一个数据加密的三大步骤
1.获取一个加密对象
2使用加密对象的update的方法,进行加密,并进行累加
3.使用hexdigest()进行获取加密结果
代码如下
#获取一个加密对象
m = hashlib.md5()
#使用加密对象的update,进行加密
m.update('abc中文'.encode('utf-8'))
#通过hexdigest获取加密结果
res = m.hexdigest()
#res = m.digest() 通过digest或者hexdigest都可以获取加密结果,但加密结果不同
print(res) #1af98e0571f7a24468a85f91b908d335
hashlib既然不是用来解密的,那加密之后我该如何去确定这就是要找到数据呢?
验证:用另一个数据加密的结果和第一次加密的结果对比。
如果结果相同,说明原文相同,如果不相同,说明原文不同。因为加密不可逆,所以只能这样来验证。
另外不同加密算法:实际就是加密结果的长度不同。例如:
s = hashlib.sha224()
s.update(b'abc')
print(len(s.hexdigest())) # 56
print(len(hashlib.md5().hexdigest())) # 32
print(len(hashlib.sha256().hexdigest())) # 64
说了这么多,不如实践一下
利用hashlib模块来写一个注册登录小程序
import hashlib
ef get_md5(username,password):
m = hashlib.md5()
m.update(username.encode('utf-8'))
m.update(password.encode('utf_8'))
return m.hexdigest()
def regiseter(username,password):
#加密
res =get_md5(username,password)
#写入文件
with open('login.txt',mode='at',encoding='utf-8') as f:
f.write(res+'\n')
def login(usernamw,password):
#获取当前信息登陆信息的加密结果:
res = get_md5(username,password)
#读文件,和其中的数据进行对比
with open('login.txt',mode='rt',encoding='utf-8') as f:
for line in f:
if res ==line.strip():
return True
else:
return False
isflog = True
while isflog:
op = input('1.注册 2.登陆 3.退出')
if op == '1':
username = input('输入用户名:')
password = input('输入密码:')
regiseter(username,password)
elif op == '2':
username = input('输入用户姓名:')
password = input('请输入密码')
res = login(username,password)
print(res)
if res:
print('登陆成功')
else:
print('登陆失败')
elif op =='3':
break
现在你是否对hashlib模块有了更深的了解了呢?
最后还有collections模块
这个模块我感觉Counter()还是有点意思的,其他的不常用就不给各位增加阅读长度了
直接上代码
# Counter() 计算器
c = Counter('46543465467644674+6')传入字符串
print(c) # Counter({'4': 7, '6': 6, '5': 2, '7': 2, '3': 1, '+': 1})
print(c.most_common(2)) #[('4', 7), ('6', 6)]
大白话就是将你传入的字符串按形状进行分类并计算个数,.most_common()这个方法可以将计算的个数并排序,你要几名,就给你显示个数多的前几名,就像期末考试老师要你们班前几的名单就说前多少名报你的名字。
以上是笔者在Python学习中的想法和笔记,整理出来帮助需要帮助的人。如有出错,还望各位兄弟们指出,评论席交流。