python3–内置模块Ⅱ

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

找个站点破解下

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

[编程题] 双核处理分析代码

一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n...

814
来自专栏开发与安全

从零开始学C++之虚继承和虚函数对C++对象内存模型造成的影响(类/对象的大小)

首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(me...

2270
来自专栏从流域到海域

《笨办法学Python》 第41课手记

《笨办法学Python》 第41课手记 本节课的代码有168行,但是冗长不代表困难,只是print里面的游戏说明内容太多,整体来说是很容易的,你要锻炼自己的耐心...

3527
来自专栏夏时

PHP 常用函数大全

5932
来自专栏java思维导图

8张图理解Java,一图胜千言

一图胜千言,下面图解均来自Program Creek 网站。如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟。 1、字符串不变性 下面这张图展示了这段代码...

2453
来自专栏数据结构与算法

07:机器翻译

7:机器翻译 总时间限制: 1000ms 内存限制: 65536kB描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件...

4136
来自专栏数据结构与算法

P1801 黑匣子_NOI导刊2010提高(06)

题目描述 Black Box是一种原始的数据库。它可以储存一个整数数组,还有一个特别的变量i。最开始的时候Black Box是空的.而i等于0。这个Black ...

3416
来自专栏吴伟祥

关于“分类”的应用 原

三、SQL中区分类别的过滤条件:比如取分类2,那么就是 2=2 <![CDATA[ & ]]>type

862
来自专栏程序员互动联盟

【答疑释惑】C语言里面结构体大小统计方法

之前说过一个关于结构体在内存中所占字节数的问题,我们知道结构体长度的计算并不是所有成员长度的相加,而是因为编译器优化会对其进行对齐,这样会优化访问速度等。 那...

3227
来自专栏mathor

LeetCode329. 矩阵中的最长递增路径

 dfs,主函数中枚举起点,然后dfs函数中枚举四个方向进行移动,但是光dfs还不够,因为我们发现存在很多冗余,所以这是一道dfs+dp的问题,resul...

1551

扫码关注云+社区

领取腾讯云代金券