Python day17
hashlib模块
什么是hash?
hash是一种算法,hash算法有很多但不同的hash算法只是复杂度不一样,算法接受传入的内容,经过运算得到一串hash值
hash值有三大特点:
1.只要传入的内容一样并且指定的算法也一样,得到的hash值必然一样
2.不能由hash值反解成内容
3.只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的。
所以基于1和3可以做文件下载一致性的校验
而基于1和2则可以对用户密码进行加密
hash算法就像一座工厂,工厂接收你送来的原材料,经过加工返回的产品就是hash值
hashlib用法
import hashlib
obj = hashlib.md5()
obj.update("你好".encode('utf-8'))#hash只接受bytes类型
obj.update("hello".encode('utf-8'))
obj.update("哈哈".encode('utf-8'))
print(m.hexdigest())#43b2fa0da902a2d9175fb4d4b858e5d5使用hexdiges()方法输出算出的hash值
因为update的内容进行拼接,只有调用hexdigest方法才会返回它的内容。所以也可以这样写
import hashlib
m = hashlib.md5()
m.update("你好".encode("utf-8"))#这里一定要传bytes类型
m.update("hello".encode("utf-8"))#这里一定要传bytes类型
m.update("哈".encode("utf-8"))#这里一定要传bytes类型
m.update("哈".encode("utf-8"))#这里一定要传bytes类型
print(m.hexdigest())#43b2fa0da902a2d9175fb4d4b858e5d5
效验文件的技巧:
将一份文件平均切分打几个点如何抽取10个字节,当这些字节的hash值全都相同之时这个文件基本上也就没有问题啦(除非真的就那么巧(雾))
密码加盐:
加密的文件,都是可以破解的.但是当破解真的很难时,大部分人都会选择放弃(不包括头铁的)
所以我们可以通过加盐的方式给数据加大破解难度。
即在传输数据的时候,给他加一些无用内容。
例:
m = hashlib.md5()
m.update("天王".encode('utf-8')) #盐
m.update("12345".encode('utf-8')) # 这是原本的密码
m.update("盖地虎".encode('utf-8')) #盐
print(m.hexdigest())
subprocess模块
subprocess模块允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等
Popen
import subprocess
obj = subprocess.Popen("tasklist", # Popen 等同于cmd.exe命令解释器而 “Tasklist”命令是一个用来查看运行在本地或远程计算机上的所有进程的命令行工具。
shell=True,
stdout=subprocess.PIPE, # 管道连接正确输出结果
stderr=subprocess.PIPE # 管道连接错误输出结果
)
print( obj) # <subprocess.Popen object at 0x00000193E7E04BB0>
stdout_res = obj.stdout.read()# 主进程从管道拿到子进程正确的结果
stderr_res = obj.stderr.read()# 主进程从管道拿到子进程错误的结果
print(stdout_res.decode('gbk'))# 而subprocess使用当前系统默认编码,得到结果为bytes类型,在windows系统下需要使用gbk来解码
print(stderr_res.decode('gbk'))
os模块已经sys模块
OS 文件/目录方法
os模块是与操作系统交互的一个接口
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的大小
sys模块
1 sys.argv 命令行参数List,第一个元素是程序本身路径
2 sys.exit(n) 退出程序,正常退出时exit(0)
3 sys.version 获取Python解释程序的版本信息
4 sys.maxint 最大的Int值
5 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6 sys.platform 返回操作系统平台名称
从命令行模式接收并copy文件
import sys
# print(sys.argv)
src_file = sys.argv[1]
dst_file = sys.argv[2]
with open(r'%s' %src_file,mode='rb') as f1,\
open(r'%s' %dst_file,mode='wb') as f2:
for line in f1:
f2.write(line)
知识储备
#进度条的效果
[# ]
[## ]
[### ]
[#### ]
#指定宽度
print('[%-15s]' %'#')
print('[%-15s]' %'##')
print('[%-15s]' %'###')
print('[%-15s]' %'####')
#打印%
print('%s%%' %(100)) #第二个%号代表取消第一个%的特殊意义
#可传参来控制宽度
print('[%%-%ds]' %50) #[%-50s]
print(('[%%-%ds]' %50) %'#')
print(('[%%-%ds]' %50) %'##')
print(('[%%-%ds]' %50) %'###')
#=========实现打印进度条函数==========
import sys
import time
def progress(percent,width=50):
if percent >= 1:
percent=1
show_str=('[%%-%ds]' %width) %(int(width*percent)*'#')
print('\r%s %d%%' %(show_str,int(100*percent)),file=sys.stdout,flush=True,end='')
#=========应用==========
data_size=1025
recv_size=0
while recv_size < data_size:
time.sleep(0.1) #模拟数据的传输延迟
recv_size+=1024 #每次收1024
percent=recv_size/data_size #接收的比例
progress(percent,width=70) #进度条的宽度70
configparser模块
configparser模块是用来解析ini配置文件的解析器
配置文件中的内容:
#config.ini 配置文件
[mysqld] # 标题
k1 = v1 # 配置项 key:value的形式
k2:v2
user=zhangsan
age=18
is_admin=true
salary=31
log_path = D:\a\b\c.log
[client]
k1 = v1
解析配置文件
import configparser
config = configparser.ConfigParser() # 返回一个对象
config.read('config.ini') #,用这个对象执行.read(配置文件)
res = config.sections() # 拿到config.ini配置文件下所有的标题
print(res)
res = config.options('mysqld') # 拿到标题mysqld下所有配置项key=value的key
res = config.items('mysqld') # 拿到标题mysqld下所有配置项key=value的(key,value)格式
print(res)
res = config.get('mysqld', 'log_path') # 指定拿到标题mysqld下log_path日志的路径
print(res)
res = config.getint('mysqld', 'age') # 拿到标题mysqld下age的值=>整数格式
res = config.getboolean('mysqld', 'is_admin') #拿到标题mysqld下is_admin的值=>布尔值格式
print(res,type(res))
res = conf.getfloat('mysqld','salary') # 拿到标题mysqld下salary的值=>浮点型格式
print(res)