模块,用一砣代码实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;file是文件操作相关的模块
模块分为三种:
- 自定义模块,文件或文件夹
- 内置模块
- 开源模块
1 # python 安装第三方模块 2 # 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+python的scripts路径 3 (1) python管理工具 pip 4 # python3 -m pip install requests # 3版本安装 5 6 (2) 源码安装 7 解压 8 cmd 9 进到你下载的包路径 10 python setup.py install #选择你要安装的Python版本。
windows下安装开源模块
报错
1 pip install django 2 Fatal error in launcher: Unable to create process using '"'
解决方法
1 python -m pip install package
1 如果找不到pip命令可以去scripts目录下 2 安装报错 3 C:\Python35\Scripts 4 λ pyip install django 5 Fatal error in launcher: Unable to create process using '"' 6 7 C:\Python35\Scripts 8 λ pip install django 9 Fatal error in launcher: Unable to create process using '"' 10 11 解决 python -m pip install package 12 13 C:\Python35\Scripts 14 λ python -m pip install requests 15 Collecting requests 16 Downloading requests-2.10.0-py2.py3-none-any.whl (506kB) 17 100% |████████████████████████████████| 507kB 144kB/s 18 Installing collected packages: requests 19 Successfully installed requests-2.10.0 20 You are using pip version 7.1.2, however version 8.1.2 is available. 21 You should consider upgrading via the 'python -m pip install --upgrade pip' command. 22 23 C:\Python35\Scripts 24 λ piython -m pip install django 25 Collecting django 26 Downloading Django-1.9.6-py2.py3-none-any.whl (6.6MB) 27 100% |████████████████████████████████| 6.6MB 64kB/s 28 Installing collected packages: django 29 Successfully installed django-1.9.6 30 You are using pip version 7.1.2, however version 8.1.2 is available. 31 You should consider upgrading via the 'python -m pip install --upgrade pip' command. 32 33 34 C:\Python35\Scripts 35 λ python3 -m pip install django 36 Collecting django 37 Using cached Django-1.9.6-py2.py3-none-any.whl 38 Installing collected packages: django 39 Successfully installed django-1.9.6 40 You are using pip version 7.1.2, however version 8.1.2 is available. 41 You should consider upgrading via the 'python -m pip install --upgrade pip' command.
二 自定义模块
也就是自己写的python脚本,而目录就是所谓的包
1 定义模块
2 导入模块
Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:
1 import module 2 from module.xx.xx import xx 3 from module.xx.xx import xx as rename 4 from module.xx.xx import *
2 .2 导入模块后如何调用
1 第一种: 2 from lib import account 3 ret = account.login() # 导入模块,这里方法调用必须用模块 4 print(ret) 5 第二种: 6 from lib.account import login #这里如果直接导入方法,需要包.模块 7 ret = login() 8 print(ret) 9 第三种 10 import lib.account #如果是直接import 11 ret = lib.account.login() #调用时候需要从头开始写 12 print(ret) 13 第四种: 14 from lib.account import login as l #as使用 15 ret = l() 16 print(ret) 17 18 19 account 文件 20 #!/usr/bin/env python 21 # _*_ coding:utf-8 _*_ 23 24 def login(): 25 return "login" 26 27 def register(): 28 return "register" 29 30 def logout(): 31 return "logout"
3 模块默认查找路径
导入模块其实就是告诉Python解释器去解释那个py文件
- 导入一个py文件,解释器解释该py文件
- 导入一个包,解释器解释该包下的 __init__.py 文件 【py2.7】
那么问题来了,导入模块时是根据那个路径作为基准来进行的呢?即:sys.path,根据sys.path下的路径去找。
1 import sys 2 print(sys.path) 3 4 5 6 C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/mk.py 7 ['E:\\py\\55\\learn-python\\oldboy\\6',
'E:\\py\\55\\learn-python\\oldboy',
'C:\\Python35\\python35.zip',
'C:\\Python35\\DLLs',
'C:\\Python35\\lib',
'C:\\Python35',
'C:\\Python35\\lib\\site-packages']
4 将某个路径加入到环境变量
如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
1 # 将d盘写的一个脚本加入到sys路径,这样D盘下面的py文件就可以作为模块直接用。 2 import sys 3 sys.path.append("D:") 4 import buy 5 ret = buy.fun() 6 print(ret)<br><br>
1 import sys 2 import os 3 4 pre_path = os.path.abspath('../') 5 sys.path.append(pre_path)
三 内置模块
1 、os
用于提供系统级别的操作
1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 2 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd 3 os.curdir 返回当前目录: ('.') 4 os.pardir 获取当前目录的父目录字符串名:('..') 5 os.makedirs('dirname1/dirname2') 可生成多层递归目录 6 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 7 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname 8 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname 9 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ls 10 os.remove() 删除一个文件 rm 11 os.rename("oldname","newname") 重命名文件/目录 12 os.stat('path/filename') 获取文件/目录信息,包含文件大小。 13 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" 14 os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 15 os.pathsep 输出用于分割文件路径的字符串 16 os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' 17 os.system("bash command") 运行shell命令,直接显示,模拟一个人的操作, 18 os.environ 获取系统环境变量 19 os.path.abspath(path) 返回path规范化的绝对路径 20 os.path.split(path) 将path分割成目录和文件名二元组返回 21 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 22 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 23 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 24 os.path.isabs(path) 如果path是绝对路径,返回True 25 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False 26 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False 27 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 28 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 29 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 4 import os 5 6 print(os.getcwd()) 7 # 测是 chdir 切换目录,切换到上级目录 8 # pwd =os.getcwd() 9 # li = pwd.split("\\") 10 # del li[-1] 11 # pwd='\\'.join(li) 12 # print(pwd) 13 # os.chdir(pwd) 14 # print(os.getcwd()) 15 16 print(os.curdir) # 返回. 17 a = os.pardir 18 print(a) # 返回是.. 19 # os.makedirs("a/b/c") 20 # os.makedirs("a/b") #在本层目录下创建a/b 21 # os.removedirs("a/b") # b为空,删除b后,a也为空,则都删除 否则哪级不为空就会报错 22 # os.mkdir("b") #创建目录 23 # print(os.listdir('a/b')) #列出目录内一层的内容包括隐藏目录 24 # os.remove('a/b/圣达菲.py') # 删除b下的文件 25 # os.rmdir("b")# 删除空目录 否则报错 26 # os.rename("a","b") # 重命名文件或者目录 27 # print(os.stat("b")) #获取目录信息 28 # print(os.sep) # 输出路径分隔符 linux / windows // 29 # print(os.linesep) #输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 30 # print(os.pathsep) #输出用于分割文件路径的字符串 31 # print(os.name) #输出字符串指示当前使用平台。win->'nt'; Linux->'posix' 32 # os.system("ip ro") #必须在linux手动执行脚本 33 # print(os.environ) #获取环境变量 34 # print(os.path.abspath("b")) # # 获取b目录规范化的绝对路径 35 # print(os.path.split("b")) #将传入的字符串路径分割成目录和文件名二元数组返回 ('', 'b') 36 print(os.path.dirname("a/b")) #获取最后一个目录之前的路径 37 print(os.path.exists('/b/c')) #判断是否存在 返回True 或者false 38 print(os.path.basename('a/b/c')) #获取最后一层目录 39 print(os.path.isabs('a/b/c')) #是否是绝对路径 40 print(os.path.isfile('b/sss')) #最后一个名是否是文件 返回True 或者false 41 print(os.path.isdir('a/b'))#最后一个名是否是目录 返回True 或者false 42 print(os.path.join("a/b/c","b/b")) #a/b/c\b/b 43 print(os.path.getatime("a/b/c")) 44 print(os.path.getmtime("a/b/c"))
案例:
根据用户输入创建目录
1 import os,sys 2 dirname = input("input ur dir name:").strip() 3 dir_path = os.getcwd() #获取当前脚本所在目录 4 new_path = r"%s\%s"%(dir_path,dirname) #拼接输入名与目录路径 5 if not os.path.exists(new_path): 6 os.mkdir(new_path)
os 模块常用 功能 dirname basename join
这里先介绍 内置函数vars()
每个py文件相当于一个模块,而这个文件的许多方法,可以用print(var())
1 print(vars()) 2 3 ----------------- 4 C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/module_test2.py 5 {'__name__': '__main__', '__cached__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000226A98E5BE0>, '__doc__': None, '__builtins__': <module 'builtins' (built-in)>, '__spec__': None, '__file__': 'E:/py/55/learn-python/oldboy/6/module_test2.py', '__package__': None}
__doc__ #py文件开头的注释文字
__file__ #当前py文件的路径
__package__ #包含文件所在包,用 . 分隔,当前文件为None,导入的其他文件:指定文件所在包,用.分隔。
__cached__ #文件的缓存
#当前文件没有,导入的其他文件有缓存
__name__ #如果是主文件,__name__==__main__,否则,等于模块名。用作执行的条件判断。
1、主文件
调用主函数前 ,必须加判断。if __name__==__main__:
2、__file__
当前文件的路径,
返回当前文件的目录
1 print(__doc__) # python文件的注释 三引号 注释必须在开头, 2 3 print(__file__) #自身脚本文件加路径 4 print(__package__) # 当前文件为None 5 from s12_mokuai import s1 6 print(s1.__package__) # 导入模块文件的文件: 则输出导入模块文件的所在目录 7 8 # 9 # from s12_mokuai import s1 10 # print(s1.__cached__) #导入的文件,则输出其缓存目录
1 print(__cached__) #没有导入 当前文件的缓存为None,
文件路径及目录,获取文件名等等操作
1 import os 2 print(__file__)#文件的路径 3 print(os.path.dirname(__file__))#返回文件的目录,文件的上层 4 print(os.path.dirname(os.path.dirname(__file__)))#上层的上层 5 print(os.path.basename(__file__))#返回文件名 6 7 -------------------------- 8 9 C:\Python35\python3.exe E:/py/55/learn-python/oldboy/6/module_test2.py 10 E:/py/55/learn-python/oldboy/6/module_test2.py 11 E:/py/55/learn-python/oldboy/6 12 E:/py/55/learn-python/oldboy 13 module_test2.py
重点1 而 __name__的重要性不言而喻
当我们的程序只有一个入口的时候,如果加入if __name__ == "__main__": 那么我们程序主文件被导入的时候__name__的值是模块的名字,程序主程序是不执行的。
1 print(__name__) # 当执行该脚本时候输出为 __main__ 而当被导入的时候是其模块名称
# 主文件
# 调用主函数前,必须 if __name__ == "__main__":
重点2 __file__ #自身脚本文件加路径
假如当前脚本所在目录还有一个目录,python里面称为包,而这个包下有好多模块,也就是py文件,我们如果想调用,怎么用呢??这就用到os模块的 三个方法basename dirname join 还有我们刚提到的__file__ 还有 sys的path方法
1 import os,sys 2 print(os.path.dirname(__file__)) 3 p1 = os.path.dirname(__file__)#返回文件的目录,文件的上层 4 p2 = os.path.basename(__file__)#返回文件的文件名 5 new_dir = os.path.join(p1,p2)#拼接成路径 6 sys.path.append(new_dir)#加入到sys.path
2、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 返回操作系统平台名称 7 sys.stdout.write('please:') 8 val = sys.stdin.readline()[:-1]
2.1 argv 将文件名和参数做成列表返回
1 import sys 2 print(sys.argv) 3 4 saltstack_s:/share/py_test/s8 # py s9_argv.py 9 9 9 9 5 ['s9_argv.py', '9', '9', '9', '9']
sys.stdout.write()
sys.stdout.flush()刷新屏幕缓存io
1 #进度条案例 2 import time,sys 3 for i in range(101): 4 #显示进度条百分比 #号从1开始 空格从99递减 5 hashes = '#' * int(i / 100.0 * 100) 6 spaces = ' ' * (100 - len(hashes)) 7 sys.stdout.write("\r[%s] %s%%" % (hashes + spaces, i)) #必须两个%%才是,因为一个%是取模,python解释器会默认过滤 8 sys.stdout.flush() #强制刷新屏幕缓冲区使其一行输出 9 time.sleep(0.05)
1 import time 2 import sys 3 for i in range(30): 4 sys.stdout.write('\r') 5 sys.stdout.write("%s%%|%s" % (int(i/30*100),int(i/30*100)*"*")) 6 sys.stdout.flush() 7 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()
1 print time.time() # 时间戳 1970年1月1日开始计时 unix系统诞生 1463840728.7381186 2 print time.mktime(time.localtime()) #mktime 接收结构化的对象时间 转换为时间戳 1463470373.0 3 4 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) 5 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) 6 print time.strptime('2014-11-11', '%Y-%m-%d') print(time.strftime("%Y-%m-%d %H:%M",time.gmtime())) # 2016-05-21 14:25 7 8 print time.strftime('%Y-%m-%d') #默认当前时间 9 print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间 10 print time.asctime() 11 print time.asctime(time.localtime()) 12 print time.ctime(time.time()) 13 14 import datetime 15 ''' 16 datetime.date:表示日期的类。常用的属性有year, month, day 17 datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond 18 datetime.datetime:表示日期时间 19 datetime.timedelta:表示时间间隔,即两个时间点之间的长度 20 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) 21 strftime("%Y-%m-%d") 22 ''' 23 import datetime 24 print datetime.datetime.now() 25 print datetime.datetime.now() - datetime.timedelta(days=5)
3.1 time 模块练习
时间戳与日期之间的相互转化
1 当前时间戳:time.time() 2 当前日期:time.ctime() 3 1、Python下日期到时间戳的转换 4 import datetime 5 import time 6 dateC=datetime.datetime(2010,6,6,8,14,59) 7 timestamp=time.mktime(dateC.timetuple()) 8 print timestamp 9 10 2、Python下将时间戳转换到日期 11 import datetime 12 import time 13 ltime=time.localtime(1395025933) 14 timeStr=time.strftime("%Y-%m-%d %H:%M:%S", ltime)
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 __author__ = 'liujianzuo' 4 import time 5 """ 6 时间相关的操作,时间有三种表示方式: 7 8 时间戳 1970年1月1日之后的秒,即:time.time() 9 格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d') 10 结构化时间 元组包含了:等... time.struct_time 即:time.localtime() 11 """
1 ################## 时间戳 与 结构化时间 转换 ###################### 2 print(time.time()) # 时间戳 1970年1月1日开始计时 unix系统诞生 1463840728.7381186 3 print(time.ctime()) # 周 月 日 时间 年 Sat May 21 22:25:28 2016 4 print(time.ctime(time.time())) # 转换时间戳 为 Sat May 21 22:25:28 2016 5 print(time.ctime(time.time() - 86400)) # 转换时间戳 为 Sat May 21 22:25:28 2016 6 7 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) 8 obj = time.gmtime() 9 print(obj.tm_year) #获取结构化的时间年 2016 10 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) 11 #结构化时间 转换 时间戳 12 13 print(time.mktime(time.localtime())) #mktime 接收结构化的对象时间 转换为时间戳 1463470373.0 14 ################## ################## ################## ################## 15 16 ################## 结构化时间 与 字符串时间转换 ###################### 17 #将结构化的对象时间转换为字符串 trftime 即:time.struct_time(tm_year=2016, tm_mon=5,。。。) ===转换为=》 ”%Y-%m-%d %H:%M %s# “ 18 print(time.strftime("%Y-%m-%d %H:%M",time.gmtime())) # 2016-05-21 14:25 19 #将字符串日期 转换为 时间结构对象 strptime ”%Y-%m-%d %H:%M %s# “ ===转换为=》 time.struct_time(tm_year=2016, tm_mon=5,。。。) 20 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, 21 ################## ################## ################## ##################
3.2 datetime 模块练习
1 import datetime 2 ''' 3 datetime.date:表示日期的类。常用的属性有year, month, day 4 datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond 5 datetime.datetime:表示日期时间 6 datetime.timedelta:表示时间间隔,即两个时间点之间的长度 7 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) 8 strftime("%Y-%m-%d") 9 ''' 10 import datetime 11 print datetime.datetime.now() 12 print datetime.datetime.now() - datetime.timedelta(days=5)
1 # -*- coding: utf-8 -*- 2 3 4 #datetime类 5 #datetime是date与time的结合体,包括date与time的所有信息。 6 #它的构造函数如下: 7 #datetime. datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ) 8 #各参数的含义与date、time的构造函数中的一样,要注意参数值的范围。 9 10 11 12 13 # 1. datetime类定义的类属性与方法: 14 #datetime.min、datetime.max:datetime所能表示的最小值与最大值; 15 #print: datetime.max: 9999-12-31 23:59:59.999999 16 #print: datetime.min: 0001-01-01 00:00:00 17 from datetime import * 18 import time 19 print 'datetime.max:' , datetime.max 20 print 'datetime.min:' , datetime.min 21 #datetime.resolution:datetime最小单位; 22 #print: datetime.resolution: 0:00:00.000001 23 print 'datetime.resolution:' , datetime.resolution 24 #datetime.today():返回一个表示当前本地时间的datetime对象; 25 #print: today(): 2012-09-12 19:37:50.721000 26 print 'today():' , datetime.today() 27 #datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间; 28 #print: now(): 2012-09-12 19:37:50.738000 29 print 'now():' , datetime.now() 30 #datetime.utcnow():返回一个当前utc时间的datetime对象; 31 #print: 2012-09-12 11:37:50.739000 32 print 'utcnow():' , datetime.utcnow() 33 #datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息; 34 #print: fromtimestamp(tmstmp): 2012-09-12 19:37:50.741000 35 print 'fromtimestamp(tmstmp):' , datetime.fromtimestamp(time.time()) 36 #datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象; 37 #print: utcfromtimestamp(tmstmp): 2012-09-12 11:37:50.742000 38 print 'utcfromtimestamp(tmstmp):' , datetime.utcfromtimestamp(time.time()) 39 #datetime.combine(date, time):根据date和time,创建一个datetime对象; 40 #print: datetime.combine(date,time): 2012-09-12 19:46:05 41 d = date(2012,9,12) 42 from datetime import * 43 t = time(19,46,5) 44 print 'datetime.combine(date,time): ',datetime.combine(d,t) 45 #datetime.strptime(date_string, format):将格式字符串转换为datetime对象; 46 #print: 2007-03-04 21:08:12 47 print datetime.strptime("2007-03-04 21:08:12", "%Y-%m-%d %H:%M:%S") 48 49 50 #2. datetime类提供的实例方法与属性 51 dt = datetime.strptime("2012-09-12 21:08:12", "%Y-%m-%d %H:%M:%S") 52 #print: 2012 9 12 21 8 12 0 None 53 print dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second,dt.microsecond,dt.tzinfo 54 print dt.date() 55 print dt.time() 56 print dt.replace(year = 2013) 57 print dt.timetuple() 58 print dt.utctimetuple() 59 print dt.toordinal() 60 print dt.weekday() 61 print dt.isocalendar() 62 #print dt.isoformat([sep]) 63 #datetime. ctime ():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple())); 64 65 66 #3. 格式字符串 67 # datetime. strftime (format) 68 # %a 星期的简写。如 星期三为Web 69 # %A 星期的全写。如 星期三为Wednesday 70 # %b 月份的简写。如4月份为Apr 71 # %B月份的全写。如4月份为April 72 # %c: 日期时间的字符串表示。(如: 04/07/10 10:43:39) 73 # %d: 日在这个月中的天数(是这个月的第几天) 74 # %f: 微秒(范围[0,999999]) 75 # %H: 小时(24小时制,[0, 23]) 76 # %I: 小时(12小时制,[0, 11]) 77 # %j: 日在年中的天数 [001,366](是当年的第几天) 78 # %m: 月份([01,12]) 79 # %M: 分钟([00,59]) 80 # %p: AM或者PM 81 # %S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~) 82 # %U: 周在当年的周数当年的第几周),星期天作为周的第一天 83 # %w: 今天在这周的天数,范围为[0, 6],6表示星期天 84 # %W: 周在当年的周数(是当年的第几周),星期一作为周的第一天 85 # %x: 日期字符串(如:04/07/10) 86 # %X: 时间字符串(如:10:43:39) 87 # %y: 2个数字表示的年份 88 # %Y: 4个数字表示的年份 89 # %z: 与utc时间的间隔 (如果是本地时间,返回空字符串) 90 # %Z: 时区名称(如果是本地时间,返回空字符串) 91 # %%: %% => % 92 93 94 dt = datetime.now() 95 #print: (%Y-%m-%d %H:%M:%S %f): 2012-09-12 23:04:27 145000 96 print '(%Y-%m-%d %H:%M:%S %f): ', dt.strftime('%Y-%m-%d %H:%M:%S %f') 97 #print: (%Y-%m-%d %H:%M:%S %p): 12-09-12 11:04:27 PM 98 print '(%Y-%m-%d %H:%M:%S %p): ', dt.strftime('%y-%m-%d %I:%M:%S %p') 99 #print: %a: Wed 100 print '%%a: %s ' % dt.strftime('%a') 101 #print: %A: Wednesday 102 print '%%A: %s ' % dt.strftime('%A') 103 #print: %b: Sep 104 print '%%b: %s ' % dt.strftime('%b') 105 #print: %B: September 106 print '%%B: %s ' % dt.strftime('%B') 107 #print: 日期时间%c: 09/12/12 23:04:27 108 print '日期时间%%c: %s ' % dt.strftime('%c') 109 #print: 日期%x:09/12/12 110 print '日期%%x:%s ' % dt.strftime('%x') 111 #print: 时间%X:23:04:27 112 print '时间%%X:%s ' % dt.strftime('%X') 113 #print: 今天是这周的第3天 114 print '今天是这周的第%s天 ' % dt.strftime('%w') 115 #print: 今天是今年的第256天 116 print '今天是今年的第%s天 ' % dt.strftime('%j') 117 #print: 今周是今年的第37周 118 print '今周是今年的第%s周 ' % dt.strftime('%U')
4 hashlib
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
1 import hashlib 2 3 # ######## md5 ######## 4 5 hash = hashlib.md5() 6 hash.update(bytes("admin",encoding="utf-8")) 7 print(hash.hexdigest()) 8 9 # ######## sha1 ######## 10 11 hash = hashlib.sha1() 12 hash.update(bytes("admin",encoding="utf-8")) 13 print(hash.hexdigest()) 14 15 # ######## sha256 ######## 16 17 hash = hashlib.sha256() 18 hash.update(bytes("admin",encoding="utf-8")) 19 print(hash.hexdigest()) 20 21 # ######## sha384 ######## 22 23 hash = hashlib.sha384() 24 hash.update(bytes("admin",encoding="utf-8")) 25 print(hash.hexdigest()) 26 27 # ######## sha512 ######## 28 29 hash = hashlib.sha512() 30 hash.update(bytes("admin",encoding="utf-8")) 31 print(hash.hexdigest())
加盐
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
1 ######## md5 加盐######## 2 3 hash = hashlib.md5(bytes("salt;%#%salt",encoding="utf-8")) 4 5 hash.update(bytes("admin",encoding="utf-8")) 6 print(hash.hexdigest())
1 obj = hashlib.md5(bytes("salt;%#%salt", encoding="utf-8")) # 这里是输入的盐值 ##创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文 2 print(obj) # <md5 HASH object @ 0x0000000000A1F800> 3 obj.update(bytes("mypasswd123", encoding="utf-8")) # 更新哈希对象以字符串参数 其实就是你的明文密码 4 print(obj.digest()) ##返回摘要,作为二进制数据字符串值 b'\x04\x80)\x17\\\xf8dPA\xbc\xd9@e\xeb&\x0f' 5 print(obj.hexdigest()) # 返回十六进制数字字符串 048029175cf8645041bcd94065eb260f
HMAC加密:
python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
消息认证算法:MAC (Message Authentication Codes) 消息认证码
1 import hmac 2 h = hmac.new('wupeiqi') 3 h.update('hellowo') 4 print h.hexdigest()
1 对称加密: 2 加密算法 + 口令 3 明文 --> 密文 4 5 字典攻击 6 7 20位:100^20=10^32 8 9 加密方,解密方使用同一个口令 10 11 加密算法: 12 DES:56位 2003 被电子边境委员会组织3个小时轻松破解所有des 13 AES:128位 高级加密标准 14 3DES:3次加密后的 15 16 加密方,解密方使用同一个口令 17 DES(56bits), 3DES, AES(128bits), Blowfish 18 Twofish, IDEA, RC6, CAST5, Serpent 19 20 block 21 22 特性:1、加密/解密使用同一口令 23 2、将原文分割成固定大小的数据块,对这些进行加密 24 ECB, CBC 25 密钥交换(IKE: Internet Key Exchange):DH算法 发明者两个人的名字首字母 26 27 非对称加密: :本地生成一对钥匙,公钥私钥,公钥是可以公开的,私钥是自己的。跟别人通信,就把对方的公钥要过来,加密完,只有对方才能解开。 28 由于加密太长,所以不用来加密数据。用对称密码加密数据,用非对称密码的钥匙加密身份 29 30 加密算法:RSA, EIGamal, DSA 31 32 1、密钥交换 33 2、身份认证 34 单向加密: 35 抽取数据特征码: 36 MD5, SHA1, SHA512, CRC-32(循环冗余校验码) 37 38 1、完整性 39 40 消息认证算法:MAC (Message Authentication Codes) 消息认证码 41 CBC-MAC 42 HMAC: 43 44 雪崩效应: 45 定长输入: 46 47 48 49 数据加密: 抽取数据特征码用单向加密,再用非对称加密特征码,加在数据前面,然后在用对称加密,然后再用对方的公钥加密数据。发送出去。