常用模块整理
random模块
小数部分:
1.random.random() 大于0且小于1之间的小数,取不到边界
2.random.uniform(0,m) 大于0小于m的小数,取不到边界
整数部分:
3.random.randint(1,10) 大于等于1小于等于10的整数,可取边界
4.random.randrange(1,10,2) 大于等于1小于10的整数,不取右边界
列表随机:
5.random.choice(list) 随机返回列表中一个元素
6.random.sample(list,3) 随机返回列表中3个元素
7.random.shuffle(list) 随机给列表排序
time模块
组成: 时间戳时间,结构化时间,格式化时间
1) 时间戳时间: 又称格林威治时间,float数据类型,主要是给机器使用的时间.
time.time() 用来获取截至目前一共用时多少秒,是从1970.1.1开始计时的.
2) 结构化时间: 时间对象,上下两种格式的中间形态.
print(time.localtime()) 理解为:把时间戳时间经过localtime()换算后的初级形态,供格式化时间
时来使用. 其结构是个元组,包含有年月日等一些信息.
3) 格式化时间: 又称字符串时间,str数据类型,主要是给人来使用的时间.
time.strftime(%Y-%m-%d) 用来获取当前时间,并指定了显示格式
4) 三者之间换算:
时间戳time.localtime结构化时间time.strftime格式化时间
格式化时间time.strptime结构化时间mktime时间戳
5) 小练习: 计算本月1号的时间戳
re=time.strftime(%Y-%m-1) 获取到当月1号的格式化时间
struct_time=time.strptime(re) 得到当月1号的结构化时间
print(time.mktime(struct_time)) 得到当月1号的时间戳时间
sys模块
作用: 和python解释器打交道的模块
常用命令: sys.path: 用来获取当前执行文件的所有路径
sys.modules: 用来查看当前加载的所有模块信息
sys.platform: 用来获取当前的操作系统位数信息,不准
sys.exit(): 放在程序中间,用来强制解释器退出,不执行后续代码的.
sys.argv: 会生成个列表,并把执行这个文件时,写在python命令后的所有东西全部作为
列表元素添加进去.以空格隔开的为一个元素.
用处举例: 在cmd窗口运行时,一次性把程序需要的所有元素都输入,让其自动运行
name = sys.argv[1]
pwd = sys.argv[2]
if name == 'alex' and pwd == '3714':
print('执行以下代码')
else:
exit()
os模块:
作用: 用来和操作系统打交道的
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir(文件路径) 改变当前脚本工作目录,相当于shell下的cd
os.curdir 返回当前目录,等同于. os.pardir() 获取当前目录的父目录字符串,等同于..
os.makedirs(名称1,名称2,名称3...) 可一次生成多层递归目录
os.mkdir(名称1) 可生成单级目录,如名称1存在则报错
os.removedirs(名称1,名称2,名称3..) 若目录为空,则删除,并递归到上一级,还为空,接着删,以此类推
os.rmdir(名称1) 删除单级目录,若目录不为空则无法删除
os.listdir(目录名) 列出指定目录下的一级内容,包含隐藏文件,并以列表形式打印.
os.remove(路径) 删除一个文件 os.rename(‘新文件’,’原文件’) 更改新文件名为原文件名.
os.stat(path/filename) 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符, win\ linux/
os.linesep 输出操作系统使用的行终止符,win:\r\n linux:\n
os.pathsep 输出用于分割文件路径的字符, win下是; linux下是:
os.name 输出字符串指示当前使用平台, ’nt’代表win ‘posix’代表linux
os.system(bash command) 运行shell命令,直接显示
os.popen(bash command).read() 运行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; 不存在则返回False
os.path.isabs(path) 如果path是绝对路径,则返回True
os.path.isfile(path) 如果path是一个存在的文件,则返回True.否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True. 否则返回False
os.path.join() 将多个路径组合后返回,最后一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
序列化模块
包含三个模块: json pickle shelve
1) str_dic=json.dumps(dic) 将字典转为字符串形式
json.loads(str_dic) 将字符串形式的字典转为字典形式.
json.dump(dic,f) json.load(f) 用于文件操作.
具体用法如下:
with open(‘文件名’,mode=’w’,encoding=’utf-8’) as f:
json.dump(dic,f) 可以将字典形式转为字符串并写入文件中
with open(‘文件名’,mode=’r’,encoding=’utf-8’) as f1:
print(json.load(f)) 可以将文件内的字符串形式的字典读出,并自动转为字典形式.
限制: json格式的key必须是个字符串数据类型,如果key数字类型,那么dump后会强行转为字符串类型的数字; 字典中value是个元组时,
也会强行把元组转为列表,不可逆; 操作文件时,可一次性dump进多个数据,但不能直接一次load出来,解决办法为,dump完一个数据就
用write写入,并加入换行,然后取的时候用for循环取出一个load一个; dumps默认不支持中文,可通过修改参数的办法使其正常显示.
dic是个包含中文的字典
ret = json.dumps(dic,ensure_ascii = False) 序列化带中文字典为一个通用类型
print(ret)
dic_new = json.loads(ret) 反序列化.
print(dic_new)
最后,set集合也是不能被dump或dumps的.
2) pickle模块: 用法同json命令,有pickle.dump/pickle.dumps/pickle.load/pickle.loads这四种.
pickle.dumps得到的结果是bytes类型,要求dump时也得是b模式打开文件,其存的内容也全部
都是bytes类型,虽然看不懂,但是通过load出来后的格式和之前保持一致.
注意,用pickle来序列化一个类的对象时,要想load出对象的内容,必须要求该对象的类要存在,
不然会报错的.
pickle可一次写入多个数据,且能一次都读出来,用法如下:
with open('新文件','wb') as f:
pickle.dump({'k1':'v1'}, f)
pickle.dump({'k11':'v1'}, f)
pickle.dump({'k11':'v1'}, f) 一次写入多行
with open('新文件','rb') as f:
while True:
try:
print(pickle.load(f))
except EOFError:
break
3) shelve模块: 也是用来操作文件的; 用法举例:
f = shelve.open('文件') 会创建三个文件赋值给f
f['key'] = {'k1':(1,2,3),'k2':'v2'} 一次给三个文件都写入key:value,是个字典
f.close()
f = shelve.open('文件')
content = f['key'] 用key来取对应的value值
f.close()
print(content)
hashlib 模块
摘要算法模块, 作用:能够把一个字符串数据类型的变量转换成一个定长的,密文的字符串,字符串里的每个字符都是一个十六进制数字;对于同一个字符串,不管这个字符串有多长,只要是相同的,无论在任何环境下,什么时候执行,执行多少次,在任何语言中,只要使用相同的算法手段得到的结果永远是相同的,当字符串不同时,得到的结果一定不同. 常用的摘要算法有两个:md5和sha1
md5: 算法相对简单,效率快,得到的是个32位的字符串,每个字符都是一个十六进制数
sha1: 算法相对复杂,效率低,得到的是个40位的字符串,每个字符也都是个十六进制数
这两个算法的用法和命令都一样,这里以md5来说明,其有两个命令或者说方法:update和hexdigest
y=hashlib.md5() 实列化一个对象, 得到一个md5加工厂y
y.update(字符串.encode(‘utf-8)) 对象调方法得到加密后的内容, 给加工厂送物料
res=y.hexdigest() 对象调方法读出加密后的内容赋值给res, 加工厂给你返回加工结果
print(res) 打印输出显示出密文
以上为摘要算法的基本用法,有可能用撞库方式获得密文对应的内容.在我们可以获得用户输入的前提下,比如想升级破解的
难度,可用加盐的形式,提高密文质量.(一般现实中用户名和密码都相同的情况不会发生,各种平台也会限制用户名不得重复,从
而获得更高的保密性,示列用法如下:)
name=input(‘输入用户名’) pwd=input(‘输入密码’)
我们要加密的是用户密码, 用户名不会重复,此时可用用户名作为盐来提升密码的破解难度
y=hashlib.md5(name.encode(‘utf-8’)) md5后括号内加入的称为盐,注意也需要进行解码
y.update(pwd.encode(‘utf-8)) 用加盐后的md5来调update方法把密码进行加密
res=y.hexdigest() 读取加密后的密文
print(res) 打印呈现出来. 猜测,加盐的原理相当于是给要加密的字符串又拼接上了一段字符
用法举例: 通过对比两个文件的md5密文,可判定两个文件是否相同或判断下载的文件有么有丢包
1.y=hashlib.md5()
y.update(‘hello,world’.encode(utf-8))
print(y.hexdigest())
2.y1=hashlib.md5()
y1.update(‘hello,’.encode(utf-8))
y1.update(‘world’.encode(utf-8))
print(y1.hexdigest())
此时打印出的两个md5密文是一样的,用这个原理我们就可以对比两个远大于系统内存的文件是否一致,操作方法为分别循环两个文件,取出适量的大小分别做摘要算法,都完成后输出整体的算法结果来做比较,密文相同则认为这两个文件一致.