模块,用一砣代码实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;file是文件操作相关的模块
模块分为三种:
- 自定义模块
- 内置模块
- 开源模块
一 第三方模块安装
# python 安装第三方模块
# 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+python的scripts路径
(1) python管理工具 pip
# python3 -m pip install requests # 3版本安装
(2) 源码安装
解压
cmd
进到包路径
python setup.py install
windows下安装开源模块
报错
λ pip install django Fatal error in launcher: Unable to create process using '"'
解决
python -m pip install package
如果找不到pip命令可以去scripts目录下
安装报错
C:\Python35\Scripts
λ pyip install django
Fatal error in launcher: Unable to create process using '"'
C:\Python35\Scripts
λ pip install django
Fatal error in launcher: Unable to create process using '"'
解决 python -m pip install package
C:\Python35\Scripts
λ python -m pip install requests
Collecting requests
Downloading requests-2.10.0-py2.py3-none-any.whl (506kB)
100% |████████████████████████████████| 507kB 144kB/s
Installing collected packages: requests
Successfully installed requests-2.10.0
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
C:\Python35\Scripts
λ piython -m pip install django
Collecting django
Downloading Django-1.9.6-py2.py3-none-any.whl (6.6MB)
100% |████████████████████████████████| 6.6MB 64kB/s
Installing collected packages: django
Successfully installed django-1.9.6
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
C:\Python35\Scripts
λ python3 -m pip install django
Collecting django
Using cached Django-1.9.6-py2.py3-none-any.whl
Installing collected packages: django
Successfully installed django-1.9.6
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
二 自定义模块
也就是自己写的python脚本,而目录就是所谓的包
1 定义模块
2 导入模块
Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:
import module from module.xx.xx import xx from module.xx.xx import xx as rename from module.xx.xx import *
2 .2 导入模块后如何调用
第一种:
from lib import account
ret = account.login() # 导入模块,这里方法调用必须用模块
print(ret)
第二种:
from lib.account import login #这里如果直接导入方法,需要包.模块
ret = login()
print(ret)
第三种
import lib.account #如果是直接import
ret = lib.account.login() #调用时候需要从头开始写
print(ret)
第四种:
from lib.account import login as l #as使用
ret = l()
print(ret)
account 文件
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
def login():
return "login"
def register():
return "register"
def logout():
return "logout"
3 模块默认查找路径
导入模块其实就是告诉Python解释器去解释那个py文件
- 导入一个py文件,解释器解释该py文件
- 导入一个包,解释器解释该包下的 __init__.py 文件 【py2.7】
那么问题来了,导入模块时是根据那个路径作为基准来进行的呢?即:sys.path
import sys print(sys.path) 结果 C:\Python35\python3.exe "E:/py_test/s9 补充正则/s2_mokuai.py" ['E:\\py_test\\s9 补充正则', 'E:\\py_test', 'C:\\Python35\\python35.zip', 'C:\\Python35\\DLLs', 'C:\\Python35\\lib', 'C:\\Python35', 'C:\\Python35\\lib\\site-packages']
4 将某个路径加入到环境变量
如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
# 将d盘写的一个脚本加入到sys路径
import sys
sys.path.append("D:")
import buy
ret = buy.fun()
print(ret)
import sys
import os
pre_path = os.path.abspath('../')
sys.path.append(pre_path)
三 内置模块
1 、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 输出用于分割文件路径的字符串
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所指向的文件或者目录的最后修改时间
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
import os
print(os.getcwd())
# 测是 chdir 切换目录,切换到上级目录
# pwd =os.getcwd()
# li = pwd.split("\\")
# del li[-1]
# pwd='\\'.join(li)
# print(pwd)
# os.chdir(pwd)
# print(os.getcwd())
print(os.curdir) # 返回.
a = os.pardir
print(a) # 返回是..
# os.makedirs("a/b/c")
# os.makedirs("a/b") #在本层目录下创建a/b
# os.removedirs("a/b") # b为空,删除b后,a也为空,则都删除 否则哪级不为空就会报错
# os.mkdir("b") #创建目录
# print(os.listdir('a/b')) #列出目录内一层的内容包括隐藏目录
# os.remove('a/b/圣达菲.py') # 删除b下的文件
# os.rmdir("b")# 删除空目录 否则报错
# os.rename("a","b") # 重命名文件或者目录
# print(os.stat("b")) #获取目录信息
# print(os.sep) # 输出路径分隔符 linux / windows //
# print(os.linesep) #输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
# print(os.pathsep) #输出用于分割文件路径的字符串
# print(os.name) #输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
# os.system("ip ro") #必须在linux手动执行脚本
# print(os.environ) #获取环境变量
# print(os.path.abspath("b")) # # 获取b目录规范化的绝对路径
# print(os.path.split("b")) #将传入的字符串路径分割成目录和文件名二元数组返回 ('', 'b')
print(os.path.dirname("a/b")) #获取最后一个目录之前的路径
print(os.path.exists('/b/c')) #判断是否存在 返回True 或者false
print(os.path.basename('a/b/c')) #获取最后一层目录
print(os.path.isabs('a/b/c')) #是否是绝对路径
print(os.path.isfile('b/sss')) #最后一个名是否是文件 返回True 或者false
print(os.path.isdir('a/b'))#最后一个名是否是目录 返回True 或者false
print(os.path.join("a/b/c","b/b")) #a/b/c\b/b
print(os.path.getatime("a/b/c"))
print(os.path.getmtime("a/b/c"))
案例:
根据用户输入创建目录
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
import os,sys
dirname = input("input ur dir name:").strip()
dir_path = os.getcwd() #获取当前脚本所在目录
new_path = r"%s\%s"%(dir_path,dirname) #拼接输入名与目录路径
if not os.path.exists(new_path):
os.mkdir(new_path)
os 模块常用 功能 dirname basename join
这里先介绍 内置函数vars()
每个py文件相当于一个模块,而这个文件的许多方法,可以用print(var())
# print(vars())
# {'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000655C88>, '__package__': None, '__author__': 'liujianzuo', '__spec__': None, '__doc__': None, '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, '__file__': 'E:/py_test/s12_mokuai/s1.py', '__name__': '__main__'}
其中重要的几个 __doc__ __name__ __main__ __file__ __package__
# 重要 # __doc__ __name__ __main__ __file__ __package__
示例
print(__doc__) # python文件的注释 三引号 注释必须在开头, print(__file__) #自身脚本文件加路径 print(__package__) # 当前文件为None from s12_mokuai import s1 print(s1.__package__) # 导入模块文件的文件: 则输出导入模块文件的所在目录 # # from s12_mokuai import s1 # print(s1.__cached__) #导入的文件,则输出其缓存目录
print(__cached__) #没有导入 当前文件的缓存为None,
重点1 而 __name__的重要性不言而喻
当我们的程序只有一个入口的时候,如果加入if __name__ == "__main__": 那么我们程序主文件被导入的时候__name__的值是模块的名字,程序主程序是不执行的。
print(__name__) # 当执行该脚本时候输出为 __main__ 而当被导入的时候是其模块名称
# 主文件
# 调用主函数前,必须 if __name__ == "__main__":
重点2 __file__ #自身脚本文件加路径
假如当前脚本所在目录还有一个目录,python里面称为包,而这个包下有好多模块,也就是py文件,我们如果想调用,怎么用呢??这就用到os模块的 三个方法basename dirname join 还有我们刚提到的__file__ 还有 sys的path方法
import os,sys # print(os.getcwd()) print(os.path.dirname(__file__)) p1 = os.path.dirname(__file__) p2 = "bin" new_dir = os.path.join(p1,p2) sys.path.append(new_dir)
2、sys
用于提供对解释器相关的操作
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]
2.1 argv 将文件名和参数做成列表返回
#!/usr/bin/env python # _*_ coding:utf-8 _*_ __author__ = 'liujianzuo' import sys print(sys.argv) saltstack_s:/share/py_test/s8 # py s9_argv.py 9 9 9 9 ['s9_argv.py', '9', '9', '9', '9']
sys.stdout.write()
sys.stdout.flush()刷新屏幕缓存io
案例 进度条
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
import time,sys
for i in range(101):
#显示进度条百分比 #号从1开始 空格从99递减
hashes = '#' * int(i / 100.0 * 100)
spaces = ' ' * (100 - len(hashes))
sys.stdout.write("\r[%s] %s%%" % (hashes + spaces, i)) #必须两个%%才是,因为一个%是取模,python解释器会默认过滤
sys.stdout.flush() #强制刷新屏幕缓冲区使其一行输出
time.sleep(0.05)
for i in range(30):
sys.stdout.write('\r')
sys.stdout.write("%s%%|%s" % (int(i/30*100),int(i/30*100)*"*"))
sys.stdout.flush()
time.sleep(0.3)
3 time datatime模块
时间相关的操作,时间有三种表示方式:
- 时间戳 1970年1月1日之后的秒,即:time.time()
- 格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
- 结构化时间 元组包含了:年、日、星期等... time.struct_time 即:time.localtime()
print time.time() # 时间戳 1970年1月1日开始计时 unix系统诞生 1463840728.7381186
print time.mktime(time.localtime()) #mktime 接收结构化的对象时间 转换为时间戳 1463470373.0
print time.gmtime() #可加时间戳参数 # 结构化UTC时间返回 元组返回 年、日、星期 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=7, tm_min=26, tm_sec=11, tm_wday=1, tm_yday=138, tm_isdst=0)
print time.localtime() #可加时间戳参数 #结构化计算机本地时间返回 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=15, tm_min=31, tm_sec=26, tm_wday=1, tm_yday=138, tm_isdst=0)
print time.strptime('2014-11-11', '%Y-%m-%d') print(time.strftime("%Y-%m-%d %H:%M",time.gmtime())) # 2016-05-21 14:25
print time.strftime('%Y-%m-%d') #默认当前时间
print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间
print time.asctime()
print time.asctime(time.localtime())
print time.ctime(time.time())
import datetime
'''
datetime.date:表示日期的类。常用的属性有year, month, day
datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
datetime.datetime:表示日期时间
datetime.timedelta:表示时间间隔,即两个时间点之间的长度
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
strftime("%Y-%m-%d")
'''
import datetime
print datetime.datetime.now()
print datetime.datetime.now() - datetime.timedelta(days=5)
3.1 time 模块练习
时间戳与日期之间的相互转化
当前时间戳:time.time()
当前日期:time.ctime()
1、Python下日期到时间戳的转换
import datetime
import time
dateC=datetime.datetime(2010,6,6,8,14,59)
timestamp=time.mktime(dateC.timetuple())
print timestamp
2、Python下将时间戳转换到日期
import datetime
import time
ltime=time.localtime(1395025933)
timeStr=time.strftime("%Y-%m-%d %H:%M:%S", ltime)
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
import time
"""
时间相关的操作,时间有三种表示方式:
时间戳 1970年1月1日之后的秒,即:time.time()
格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
结构化时间 元组包含了:等... time.struct_time 即:time.localtime()
"""
################## 时间戳 与 结构化时间 转换 ######################
print(time.time()) # 时间戳 1970年1月1日开始计时 unix系统诞生 1463840728.7381186
print(time.ctime()) # 周 月 日 时间 年 Sat May 21 22:25:28 2016
print(time.ctime(time.time())) # 转换时间戳 为 Sat May 21 22:25:28 2016
print(time.ctime(time.time() - 86400)) # 转换时间戳 为 Sat May 21 22:25:28 2016
print(time.gmtime()) # 结构化UTC时间返回 元组返回 年、日、星期 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=7, tm_min=26, tm_sec=11, tm_wday=1, tm_yday=138, tm_isdst=0)
obj = time.gmtime()
print(obj.tm_year) #获取结构化的时间年 2016
print(time.localtime()) #结构化计算机本地时间返回 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=15, tm_min=31, tm_sec=26, tm_wday=1, tm_yday=138, tm_isdst=0)
#结构化时间 转换 时间戳
print(time.mktime(time.localtime())) #mktime 接收结构化的对象时间 转换为时间戳 1463470373.0
################## ################## ################## ##################
################## 结构化时间 与 字符串时间转换 ######################
#将结构化的对象时间转换为字符串 trftime 即:time.struct_time(tm_year=2016, tm_mon=5,。。。) ===转换为=》 ”%Y-%m-%d %H:%M %s# “
print(time.strftime("%Y-%m-%d %H:%M",time.gmtime())) # 2016-05-21 14:25
#将字符串日期 转换为 时间结构对象 strptime ”%Y-%m-%d %H:%M %s# “ ===转换为=》 time.struct_time(tm_year=2016, tm_mon=5,。。。)
print(time.strptime("2016-09-10 10:11","%Y-%m-%d %H:%M")) # time.struct_time(tm_year=2016, tm_mon=5, tm_mday=17, tm_hour=15,
################## ################## ################## ##################
3.2 datetime 模块练习
import datetime
'''
datetime.date:表示日期的类。常用的属性有year, month, day
datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
datetime.datetime:表示日期时间
datetime.timedelta:表示时间间隔,即两个时间点之间的长度
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
strftime("%Y-%m-%d")
'''
import datetime
print datetime.datetime.now()
print datetime.datetime.now() - datetime.timedelta(days=5)
# -*- coding: utf-8 -*-
#datetime类
#datetime是date与time的结合体,包括date与time的所有信息。
#它的构造函数如下:
#datetime. datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )
#各参数的含义与date、time的构造函数中的一样,要注意参数值的范围。
# 1. datetime类定义的类属性与方法:
#datetime.min、datetime.max:datetime所能表示的最小值与最大值;
#print: datetime.max: 9999-12-31 23:59:59.999999
#print: datetime.min: 0001-01-01 00:00:00
from datetime import *
import time
print 'datetime.max:' , datetime.max
print 'datetime.min:' , datetime.min
#datetime.resolution:datetime最小单位;
#print: datetime.resolution: 0:00:00.000001
print 'datetime.resolution:' , datetime.resolution
#datetime.today():返回一个表示当前本地时间的datetime对象;
#print: today(): 2012-09-12 19:37:50.721000
print 'today():' , datetime.today()
#datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
#print: now(): 2012-09-12 19:37:50.738000
print 'now():' , datetime.now()
#datetime.utcnow():返回一个当前utc时间的datetime对象;
#print: 2012-09-12 11:37:50.739000
print 'utcnow():' , datetime.utcnow()
#datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息;
#print: fromtimestamp(tmstmp): 2012-09-12 19:37:50.741000
print 'fromtimestamp(tmstmp):' , datetime.fromtimestamp(time.time())
#datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象;
#print: utcfromtimestamp(tmstmp): 2012-09-12 11:37:50.742000
print 'utcfromtimestamp(tmstmp):' , datetime.utcfromtimestamp(time.time())
#datetime.combine(date, time):根据date和time,创建一个datetime对象;
#print: datetime.combine(date,time): 2012-09-12 19:46:05
d = date(2012,9,12)
from datetime import *
t = time(19,46,5)
print 'datetime.combine(date,time): ',datetime.combine(d,t)
#datetime.strptime(date_string, format):将格式字符串转换为datetime对象;
#print: 2007-03-04 21:08:12
print datetime.strptime("2007-03-04 21:08:12", "%Y-%m-%d %H:%M:%S")
#2. datetime类提供的实例方法与属性
dt = datetime.strptime("2012-09-12 21:08:12", "%Y-%m-%d %H:%M:%S")
#print: 2012 9 12 21 8 12 0 None
print dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second,dt.microsecond,dt.tzinfo
print dt.date()
print dt.time()
print dt.replace(year = 2013)
print dt.timetuple()
print dt.utctimetuple()
print dt.toordinal()
print dt.weekday()
print dt.isocalendar()
#print dt.isoformat([sep])
#datetime. ctime ():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple()));
#3. 格式字符串
# datetime. strftime (format)
# %a 星期的简写。如 星期三为Web
# %A 星期的全写。如 星期三为Wednesday
# %b 月份的简写。如4月份为Apr
# %B月份的全写。如4月份为April
# %c: 日期时间的字符串表示。(如: 04/07/10 10:43:39)
# %d: 日在这个月中的天数(是这个月的第几天)
# %f: 微秒(范围[0,999999])
# %H: 小时(24小时制,[0, 23])
# %I: 小时(12小时制,[0, 11])
# %j: 日在年中的天数 [001,366](是当年的第几天)
# %m: 月份([01,12])
# %M: 分钟([00,59])
# %p: AM或者PM
# %S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~)
# %U: 周在当年的周数当年的第几周),星期天作为周的第一天
# %w: 今天在这周的天数,范围为[0, 6],6表示星期天
# %W: 周在当年的周数(是当年的第几周),星期一作为周的第一天
# %x: 日期字符串(如:04/07/10)
# %X: 时间字符串(如:10:43:39)
# %y: 2个数字表示的年份
# %Y: 4个数字表示的年份
# %z: 与utc时间的间隔 (如果是本地时间,返回空字符串)
# %Z: 时区名称(如果是本地时间,返回空字符串)
# %%: %% => %
dt = datetime.now()
#print: (%Y-%m-%d %H:%M:%S %f): 2012-09-12 23:04:27 145000
print '(%Y-%m-%d %H:%M:%S %f): ', dt.strftime('%Y-%m-%d %H:%M:%S %f')
#print: (%Y-%m-%d %H:%M:%S %p): 12-09-12 11:04:27 PM
print '(%Y-%m-%d %H:%M:%S %p): ', dt.strftime('%y-%m-%d %I:%M:%S %p')
#print: %a: Wed
print '%%a: %s ' % dt.strftime('%a')
#print: %A: Wednesday
print '%%A: %s ' % dt.strftime('%A')
#print: %b: Sep
print '%%b: %s ' % dt.strftime('%b')
#print: %B: September
print '%%B: %s ' % dt.strftime('%B')
#print: 日期时间%c: 09/12/12 23:04:27
print '日期时间%%c: %s ' % dt.strftime('%c')
#print: 日期%x:09/12/12
print '日期%%x:%s ' % dt.strftime('%x')
#print: 时间%X:23:04:27
print '时间%%X:%s ' % dt.strftime('%X')
#print: 今天是这周的第3天
print '今天是这周的第%s天 ' % dt.strftime('%w')
#print: 今天是今年的第256天
print '今天是今年的第%s天 ' % dt.strftime('%j')
#print: 今周是今年的第37周
print '今周是今年的第%s周 ' % dt.strftime('%U')
4 hashlib
加密方式 3种:
1 对称加密
加密算法:
DES:56位 2003 被电子边境委员会组织3个小时轻松破解所有des
AES:128位 高级加密标准
3DES:3次加密后的
2公钥加密
加密算法:
RSA, EIGamal, DSA
应用场景
1、密钥交换
2、身份认证
3单向加密
加密算法
抽取数据特征码:
MD5, SHA1, SHA512, CRC-32(循环冗余校验码)
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib
# ######## md5 ########
hash = hashlib.md5()
hash.update('admin')
print hash.hexdigest()
# ######## sha1 ########
hash = hashlib.sha1()
hash.update('admin')
print hash.hexdigest()
# ######## sha256 ########
hash = hashlib.sha256()
hash.update('admin')
print hash.hexdigest()
# ######## sha384 ########
hash = hashlib.sha384()
hash.update('admin')
print hash.hexdigest()
# ######## sha512 ########
hash = hashlib.sha512()
hash.update('admin')
print hash.hexdigest()
加盐
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
import hashlib
# ######## md5 ########
hash = hashlib.md5('898oaFs09f')
hash.update('admin') #更新哈希对象以字符串参数 其实就是你的明文密码
print hash.hexdigest() #返回十六进制数字字符串
import hashlib
obj = hashlib.md5(bytes("salt;%#%salt",encoding="utf-8")) #这里是输入的盐值 ##创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文
print(obj) #<md5 HASH object @ 0x0000000000A1F800>
obj.update(bytes("mypasswd123",encoding="utf-8")) #更新哈希对象以字符串参数 其实就是你的明文密码
print(obj.digest()) ##返回摘要,作为二进制数据字符串值 b'\x04\x80)\x17\\\xf8dPA\xbc\xd9@e\xeb&\x0f'
print(obj.hexdigest()) #返回十六进制数字字符串 048029175cf8645041bcd94065eb260f
HMAC加密:
python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
消息认证算法:MAC (Message Authentication Codes) 消息认证码
import hmac
h = hmac.new('wueiqi')
h.update('hellowo')
print h.hexdigest()
对称加密:
加密算法 + 口令
明文 --> 密文
字典攻击
20位:100^20=10^32
加密方,解密方使用同一个口令
加密算法:
DES:56位 2003 被电子边境委员会组织3个小时轻松破解所有des
AES:128位 高级加密标准
3DES:3次加密后的
加密方,解密方使用同一个口令
DES(56bits), 3DES, AES(128bits), Blowfish
Twofish, IDEA, RC6, CAST5, Serpent
block
特性:1、加密/解密使用同一口令
2、将原文分割成固定大小的数据块,对这些进行加密
ECB, CBC
密钥交换(IKE: Internet Key Exchange):DH算法 发明者两个人的名字首字母
非对称加密: :本地生成一对钥匙,公钥私钥,公钥是可以公开的,私钥是自己的。跟别人通信,就把对方的公钥要过来,加密完,只有对方才能解开。
由于加密太长,所以不用来加密数据。用对称密码加密数据,用非对称密码的钥匙加密身份
加密算法:RSA, EIGamal, DSA
1、密钥交换
2、身份认证
单向加密:
抽取数据特征码:
MD5, SHA1, SHA512, CRC-32(循环冗余校验码)
1、完整性
消息认证算法:MAC (Message Authentication Codes) 消息认证码
CBC-MAC
HMAC:
雪崩效应:
定长输入:
数据加密: 抽取数据特征码用单向加密,再用非对称加密特征码,加在数据前面,然后在用对称加密,然后再用对方的公钥加密数据。发送出去。
注册 登陆案例
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
import hashlib
def md5(arg):
"""
:param arg:
:return:
"""
obj = hashlib.md5(bytes("salt;%#%salt",encoding="utf-8")) #这里是输入的盐值 ##创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文
obj.update(bytes(arg,encoding="utf-8")) #更新哈希对象以字符串参数 其实就是你的铭文密码
return obj.hexdigest()
def login(user,pwd):
with open("account.db","r",encoding="utf-8") as f:
for line in f:
u,p = line.split("|")
if u == user and p == md5(pwd):
return True
else:
return False
def register(user,pwd):
with open("account.db","a",encoding="utf-8") as f:
username = user
password = md5(pwd)
# print(password)
# print(type(password))
# exit()
temp = username +"|"+ password
f.write(temp)
return True
def main():
print("""
1 登陆
2 注册
""")
chose = input("pls input ur choice:").strip()
chose = int(chose)
if chose == 1:
user = input("username:")
passwd = input("password:")
ret = login(user,passwd)
if ret:
print("login success")
else:
print("login error")
elif chose == 2:
user = input("register username:")
passwd = input("register password:")
ret = register(user,passwd)
if ret:
print("register success")
else:
print("register error")
if __name__ == '__main__':
main()
5 pickle 序列化 (等同json)
Python中用于序列化的两个模块
-
- json 用于【字符串】和 【python基本数据类型】 间进行转换
- pickle 用于【python特有的类型】 和 【python基本数据类型】间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
load loads dumps dump 区别
我们看一下 pickle 接口。 pickle 模块提供了以下函数对: dumps(object) 返回一个字符串,它包含一个 pickle 格式的对象; loads(string) 返回包含在 pickle 字符串中的对象; dump(object, file) 将对象写到文件,这个文件可以是实际的物理文件,但也可以是任何类似于文件的对象,这个对象具有 write() 方法,可以接受单个的字符串参数; load(file) 返回包含在 pickle 文件中的对象。
dumps dump 区别 存入文件
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
accounts = {
1000: {
'name':'Alex LI',
'email': 'lijie3721@126.com',
'passwd': 'abc123',
'balance': 15000,
'phone': 13651054608,
'bank_acc':{
'ICBC':14324234,
'CBC' : 235234,
'ABC' : 35235423
}
},
1001: {
'name': 'CaiXin Guo',
'email': 'caixin@126.com',
'passwd': 'abc145323',
'balance': -15000,
'phone': 1345635345,
'bank_acc': {
'ICBC': 4334343,
}
},
}
import pickle
# dumps 直接传存储对象
f = open("account.db","wb")
f.write(pickle.dumps(accounts))
f.close()
#dump除了传存储对象还有 打开的文件句柄
f = open("account1.db","wb")
pickle.dump(accounts,f)
f.close()
load loads 区别 这里注意文件指针 一次read 就到结尾
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
import pickle
f = open("account.db","rb")
acc = pickle.loads(f.read())
f.close()
f = open("account1.db","rb")
acc_load = pickle.load(f)
print(acc_load)
加载到内存修改后再存入文件
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
import pickle
f = open("account.db","rb")
acc = pickle.loads(f.read())
f.close()
acc[1000]['balance'] -=500
f = open("account.db","wb")
f.write(pickle.dumps(acc))
f.close()
f = open("account.db","rb")
acc = pickle.loads(f.read())
print(acc)
f.close()
6 json 序列化
首先我们应该知道,python的一些不是通用的数据类型json是不能序列话的,比如时间戳等
loads 方法 将传过来的字符串(长得像python的字典或者列表数据类型)序列化成字典或列表
注意其调用的对象内部必须是双引号,json不识别单引号,而且,整个字符串必须被单引号或者三个引号引起来,否则报错
s = '{"data":"invilad","status":"1000"}' # json 认为里面必须是双引号才会处理,否则会报错,
l = "[1,2,3]"
import json
ret = json.loads(l) # loads 将形似python数据类型列表或字典的字符串转换成 列表或者字典
print(ret,type(ret))
dumps 方法 将python数据类型列表或字典转换成形似列表或者字典的字符串
n = {'status': '1000', 'data': 'invilad'}
m = [1, 2, 3]
ret1 = json.dumps(n) # dumps 将python数据类型列表或字典转换成形似列表或者字典的字符串
print(ret1,type(ret1)) # {"data": "invilad", "status": "1000"} <class 'str'>
ret1 = json.dumps(m)
print(ret1,type(ret1)) # [1, 2, 3] <class 'str'>
dump 和load 的用法
n = {'status': '1000', 'data': 'invilad'}
m = [1, 2, 3]
# dump 功能就是 先转换为字符串,再写入文件
json.dump(n,open("db",'w'))
# load 功能就是 读取文件字符串 并转化为python数据类型
r = json.load(open("db",'r'))
print(r,type(r))
知识点2 :我们接收的网页请求过来是字符串或者字节
from urllib import request
f = request.urlopen("http://www.cnblogs.com/")
# f = request.urlopen("http://yujuanfudan.blog.163.com/")
ret = f.read()
print(type(ret))
print(str(ret,encoding="utf-8"))
7 requests 第三方模块
Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
发送GET请求
import urllib.request f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') result = f.read().decode('utf-8')