前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python3–内置模块Ⅱ

python3–内置模块Ⅱ

作者头像
老七Linux
发布2018-05-09 17:18:37
1.1K0
发布2018-05-09 17:18:37
举报

hashlib

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()

找个站点破解下

mark
mark

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 && BytesIO

StringIO

很多时候,数据读写不一定是文件(存放硬盘中),也可以在内存中读写。

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)
BytesIO

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的方法,使得和读写文件具有一致的接口。

Python JSON

JSON 函数

使用 JSON 函数需要导入 json 库:import json

Json提供四个功能:dumps, dump, loads, load

函数

描述

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'>
mark
mark
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)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017/04/27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • hashlib
    • 小实例+复习:
    • StringIO && BytesIO
      • StringIO
        • BytesIO
          • 小结
          • Python JSON
            • JSON 函数
              • Json提供四个功能:dumps, dump, loads, load
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档