Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
以常见的摘要算法MD5为例,计算出一个字符串的MD5值:
import hashlib
md5 = hashlib.md5()
src = "how to use python hashlib -zhdya"
md5.update(src.encode("utf-8"))
print(md5.hexdigest())
输出:
83a74ebcc5df95987702e750b863d8ed
注意:update()必须指定要加密的字符串的字符编码。 不然会出现如下错误:(TypeError: Unicode-objects must be encoded before hashing)
小实例:
import hashlib
import sys
def md5s():
m = hashlib.md5()
m.update(sys.argv[1].encode('utf-8'))
print(m.hexdigest())
if __name__ == '__main__':
md5s()
找个站点破解下:
MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
取列表中的值:
db = [{
'michael': 'e10adc3949ba59abbe56e057f20f883e',
'bob': '878ef96e86145580c38c87f0410ad153',
'alice': '99b1c2188db85afee403b1536010c2c9'
}]
print(type(db))
print(db[0]["michael"])
输出:
<class 'list'>
e10adc3949ba59abbe56e057f20f883e
两种方式取 字典中的值
db = {
'michael': 'e10adc3949ba59abbe56e057f20f883e',
'bob': '878ef96e86145580c38c87f0410ad153',
'alice': '99b1c2188db85afee403b1536010c2c9'
}
print(type(db))
print(db['michael']) ##第一种
print(db.get('michael')) ##第二种
输出:
<class 'dict'>
e10adc3949ba59abbe56e057f20f883e
e10adc3949ba59abbe56e057f20f883e
或者当我们不确定字典中是否存在某个键时,我之前的做法如下:
if 'michael' in db.keys():
print (db['michael'])
ok,写到这儿,我突然感觉我可以写个脚本:
设计一个验证用户登录的函数,根据用户输入的口令是否正确,返回True或False,或者打印出提示:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 4/27/2018 9:25 AM
# @Author : zhdya
# @File : 加密hashlib.py
import hashlib
def checkPasswd(passwd):
m = hashlib.md5()
m.update(passwd.encode("utf-8"))
return m.hexdigest()
def login(name, passwd):
if name in db.keys():
print("the name your input was right!")
pwd = checkPasswd(passwd)
if pwd == db[name]:
print("the passwd you input was right!!")
else:
print("you type a wrong password!!")
else:
print("pls checking the name!!")
db = {
'xiaoli': 'e10adc3949ba59abbe56e057f20f883e',
'zhdya': '21218cca77804d2ba1922c33e0151105',
'xiaop':'5f4dcc3b5aa765d61d8327deb882cf99'
}
if __name__ == '__main__':
login("zhdya","AAA")
输出:
the name your input was right!
you type a wrong password!!
如果输入:
if __name__ == '__main__':
login("zhdya","888888")
输出:
the name your input was right!
the passwd you input was right!!
当然,如果输入错误的名字:
if __name__ == '__main__':
login("asd","888888")
输出:(根本就不给你判断密码是否对)
pls checking the name!!
很多时候,数据读写不一定是文件(存放硬盘中),也可以在内存中读写。
StringIO顾名思义就是在内存中读写str。
要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:
from io import StringIO ##python2直接导入StringIO即可,Python3是放在了IO模块下
f = StringIO()
f.write("hello") ##写入hello到f
print(f.getvalue())
f.write(" ")
f.write("zhdya!!")
print(f.getvalue()) ##由此可以看出,getvalue可以一次性提取内存中所有写入的内容。
输出:
hello
hello zhdya!!
当然也可以一次性写入!
from io import StringIO
f = StringIO()
f.writelines("hello\nhello zhdya\n")
print(f.getvalue())
要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:
from io import StringIO
f = StringIO("hello~~\nhello zhdya")
while True:
aa = f.readline()
if aa == '':
break
print(aa)
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。
BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes:
from io import BytesIO
f = BytesIO()
f.write("i wanna writting english".encode("utf-8"))
print(f.getvalue())
f.write("想写点中文".encode("utf-8"))
print(f.getvalue())
输出:
b'i wanna writting english'
b'i wanna writting english\xe6\x83\xb3\xe5\x86\x99\xe7\x82\xb9\xe4\xb8\xad\xe6\x96\x87'
请注意,写入的不是str,而是经过UTF-8编码的bytes。
StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。
使用 JSON 函数需要导入 json 库:import json
函数 | 描述 |
---|---|
json.dumps() | 对数据进行编码,将 Python 对象编码成 JSON 字符串。 |
json.loads() | 对数据进行解码,将已编码的 JSON 字符串解码为 Python 对象。 |
json.dump() | 把python对象 写入文件 |
json.load() | 把文件-》 python对象 |
来个例子理解下:
import json
data = {
'name' : 'zhdya',
'sex' : 'man',
'age' : '28'
}
## Python 字典类型转换为 JSON 对象
jsonstr = json.dumps(data)
print(data)
print(type(data))
print(jsonstr)
print(type(jsonstr))
输出:
{'name': 'zhdya', 'sex': 'man', 'age': '28'}
<class 'dict'>
{"name": "zhdya", "sex": "man", "age": "28"}
<class 'str'>
import json
data = {
'name' : 'zhdya',
'sex' : 'man',
'age' : '28'
}
## Python 字典类型转换为 JSON 对象
jsonstr = json.dumps(data)
print(data)
print(type(data))
print(jsonstr)
print(type(jsonstr))
## 将 JSON 对象转换为 Python 字典
dictt = json.loads(jsonstr)
print(type(dictt))
print(dictt)
输出:
{'name': 'zhdya', 'sex': 'man', 'age': '28'}
<class 'dict'>
{"name": "zhdya", "sex": "man", "age": "28"}
<class 'str'>
<class 'dict'>
{'name': 'zhdya', 'sex': 'man', 'age': '28'}
如果你要处理的是文件而不是字符串,你可以使用 json.dump() 和 json.load() 来编码和解码JSON数据。例如:
# 写入 JSON 数据
with open('data.json', 'w') as f:
json.dump(data, f)
# 读取数据
with open('data.json', 'r') as f:
data = json.load(f)