time时间模块

时间模块的常用方法

1、time.sleep(secs)  # 推迟程序的运行时间

2、time.time() # 获取当前的时间戳

 

hasnlib模块

一种算法,python3里代替了md5和sha模块,主要提供SHA1 、SHA224、SHA256、SHA384、SHA512、MD5算法

三个特点

1、内容相同则hash结果相同,内容稍微改变则hash结果改变

2、不可逆推

3、相同算法,无论多长的数据得到的哈希值长度固定 

import hashlib
m = hashlib.md5()
m.update('hello'.encode('utf-8'))   # 要哈希的字符串必须是bytes类型
m.update('world'.encode('utf-8'))   # 可以分组hash计算,这里经过hash处理的是‘hello world’
print(m.hexdigest())   # fc5e038d38a57032085441e7fe7010b0

m1 = hashlib.md5()
m1.update('helloworld'.encode('utf-8'))
print(m1.hexdigest())   # fc5e038d38a57032085441e7fe7010b0
# 模拟密码破解过程
m = hashlib.md5()
# m.update('lidawei0606'.encode('utf-8'))
# print(m.hexdigest())   # 8fc493aad88ad154861264d165e36109
# cryt_pwd = '41208b7f023031c2bc36cee3d58c5d46' # 这里假设是通过抓包抓取到的密文密码
pwds = ['lidawei123','lidawei123','lidawei1016','lidawei0606']  # 这里是通过数据分析 可能的密码
def make_dic(pwds):   # 写一个函数,返回一个包含所有可能密码和密码hash后的结果的字典
    dic = {}
    for pwd in pwds:
        m = hashlib.md5()
        m.update(pwd.encode('utf-8'))
        dic[pwd] = m.hexdigest()
    return dic
dic = make_dic(pwds)
for key in dic:   # 遍历字典找到和抓取到的密文密码匹配的密码,打印出来
    if dic[key] == '8fc493aad88ad154861264d165e36109':
        print(key)
import hashlib
# 为了防止密码通过撞库方式破解,用以下密码加盐的方法

# 第一种方式
m = hashlib.md5()
m.update('这里的盐哦'.encode('utf-8'))   # 在被hash的密码前边或后面加入字符
m.update('lidawei0606'.encode('utf-8'))
print(m.hexdigest())

# 第二种方式
import hmac   # 也是一种hash算法,这种算法强制加盐
m = hmac.new('这里要强制加盐'.encode('utf-8'))
m.update('lidawei0606'.encode())
print(m.hexdigest())

 

 

os模块 

os模块是python与系统交互的一个接口

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir  返回当前目录: ('.')
os.pardir  获取当前目录的父目录字符串名:('..')

os.makedirs(
'dirname1/dirname2') 可生成多层递归目录
os.removedirs(
'dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件
os.rename(
"oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' os.system("bash command") 运行shell命令,直接显示 os.environ 获取系统环境变量
os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小

 

在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
>>> os.path.normcase('c:/windows\\system32\\')   
'c:\\windows\\system32\\'   
   

规范化路径,如..和/
>>> os.path.normpath('c://windows\\System32\\../Temp/')   
'c:\\windows\\Temp'   

>>> a='/Users/jieli/test1/\\\a1/\\\\aa.py/../..'
>>> print(os.path.normpath(a))
/Users/jieli/test1
os路径处理
#方式一:推荐使用
import os
#具体应用
import os,sys
possible_topdir = os.path.normpath(os.path.join(
    os.path.abspath(__file__),
    os.pardir, #上一级
    os.pardir,
    os.pardir
))
sys.path.insert(0,possible_topdir)


#方式二:不推荐使用
os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

 

 

sys模块

1、sys.argv        命令行返回参数Liist,第一个元素是程序本身路径

2、sys.exit(n)     退出程序,正常退出时exit(0)

3、sys.version    获取python解释器的版本信息

4、sys.maxint     最大的Int值

5、sys.path        返回模块的初始路径,初始化时使用PYTHONPATH环境变量的值

6、sys.platform  返回操作系统平台名称

 

序列化

把一个对象从内存中转化为可以存储或可以传输的的过程叫做序列化。

为什么使用序列化

1:持久保存状态

需知一个软件/程序的执行就在处理一系列状态的变化,在编程语言中,'状态'会以各种各样有结构的数据类型(也可简单的理解为变量)的形式被保存在内存中。

内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。

在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

具体的来说,你玩使命召唤闯到了第13关,你保存游戏状态,关机走人,下次再玩,还能从上次的位置开始继续闯关。或如,虚拟机状态的挂起等。

2:跨平台数据交互

序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

 

json

跨平台

可以序列化(字典、列表、字符串、整数、布尔、None)

不识别单引号

import json

dic = {'name': 'lidawei', 'age': 18}

with open('user_info', encoding='utf-8', mode='w')as f:  # 序列化
    f.write(json.dumps(dic))

json.dump(dic, open('user_info1', 'w', encoding='utf-8'))  # 序列化

with open('user_info', 'r', encoding='utf-8')as f:  # 反序列化
    print(json.loads(f.read()))

print(json.load(open('user_info1', 'r')))  # 反序列化 load从文件里边读取内容
 

 pickle

只适用于python,可以序列化python中的所有对象类型

import pickle

dic = {'name': 'lidawei', 'age': 18}

with open('user_info', 'wb', )as f:
    f.write(pickle.dumps(dic))

with open('user_info', 'rb')as f:
    print(pickle.loads(f.read()))

pickle.dump(dic, open('user_info1', 'wb'))

print(pickle.load(open('user_info1', 'rb')))