目录
模块 分为3类,分别为内置模块,第三方模块,自定义模块。以下介绍几个常用的模块。
模块导入顺序及书写顺序
所有的模块导入都应该尽量往上写,
顺序为:内置模块-->第三方扩展模块-->自定义模块
模块不会重复被导入
__ name__
在模块中有一个变量__name__
,
当我们直接执行这个模块的时候,__name__ =='__main__'
,
当我们执行其他模块时,在其他模块引用这个模块的时候,这个模块中的__name__='模块的名字'
重命名模块
提高代码的兼容性。
# import time as t # oracle # mysql # if 数据库 == ‘oracle’: # import oracle as db # elif 数据库 == ‘mysql’: # import mysql as db
time 模块
格式化时间: 给 人 看的。表示的是普通的字符串形式的时间。
时间戳: float时间 , 给计算机看的。 表示的是从1970年1月1日0:00:00开始按秒计算的偏移量。
结构化时间: 元组, 运算用的。struct_time元组共有九个元素,分别为(年、月、日、时、分、秒、一年中第几周,一年中第几天,夏令时)
# print(time.strftime("%Y-%m-%d %a %H:%M:%S")) #year month day HOUR MINUTE SECOND time.time() 时间戳 time.sleep() 延时 time.strftime() 格式化时间,按照规定的格式 输出时间 time.localtime() 时间戳 --> 结构化时间 。 # 本地时区的 time.localtime().tm_year 等等 取具体的年月份 time.gmtime() # UTC时区的时间 time.strptime('2000-12.31','%Y-%m.%d') 格式化时间 --> 结构化时间 time.strftime('%m/%d/%Y %H:%M:%S',time.localtime(3000000000)) 结构化时间 --> 格式化时间
不同时间格式的转换
datetime 模块
datetime模块一般用于时间的加减。
print(datetime.datetime.now()) # 返回当前时间 print(datetime.date.fromtimestamp(time.time())) # 返回 年-月-日 # 时间的加减--timedelta() 参数默认为days print(datetime.datetime.now()+datetime.timedelta(3)) # 在当前时间上+3天 print(datetime.datetime.now()+datetime.timedelta(-3)) # 在当前时间上-3天 # 加减小时。传hours=3即+3小时,hours=-3 即减3小时 # 加减分钟 。同小时 # 时间替换 c_time = datetime.datetime.now() print(c_time.replace(hour=2,second=3,minute=1))
random模块
这个模块 主要用于生成随机字符。
玩游戏掷骰子、随机验证码,抽奖系统都可以使用这个模块进行开发编程。
开发过程中,经常用到的知识点如下:
# 字母 = chr(数字) # 可以用此来开发一个数字和字母混杂的随机验证码 import random print(random.random()) # 返回的是0到1之间的小数 print(random.randint(1,3)) # 返回的是 大于1且小于等于3之间的额整数 print(random.randrange(1,4)) # 返回的是 大于1且小于4之间的整数 print(random.uniform(1,3)) # 返回的是 大于1 小于3 的小数 print(random.choice([1,23,4,5,6])) # 返回的是列表中的任意一个元素 print(random.sample([1,2,4],n)) # 以列表形式返回列表中任意n个元素的组合。n不能大于列表的长度 lis = [1,3,4,5,7,8] random.shuffle(lis) # 打乱lis内元素的顺序,相当于洗牌 print(lis)
os模块
负责程序与操作系统交互,多用于文件处理.
当前文件可以使用 内置变量 __file__
os.getcwd() # 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") # 改变当前脚本工作目录;相当于shell下cd os.curdir # 返回当前目录: ('.') os.pardir # 获取当前目录的父目录字符串名:('..') os.makedirs('dir1/dir2') # 可生成多层递归目录 os.removedirs('dirname1') # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') # 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') # 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() # 删除一个文件 os.rename("oldname","new") # 重命名文件/目录 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所指向的文件或者目录的最后修改时间 os.path.getsize(path) # 返回path的大小
sys模块
用于提供对python解释器相关的操作
sys.argv # 命令行参数List,第一个元素是程序本身路径 sys.exit(n) # 退出程序,正常退出时exit(0) sys.version # 获取Python解释程序的版本信息 sys.maxint # 最大的Int值 sys.path # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform # 返回操作系统平台名称 sys.stdin # 标准输入 sys.stdout # 标准输出 sys.stderror # 错误输出 sys.modules # 已导入的模块,以字典形式返回
sys.argv 举例:
ret = sys.argv name = ret[1] pwd = ret[2] if name == 'alex' and pwd == 'alex3714': print('登陆成功') else: print("错误的用户名和密码") sys.exit() print('你可以使用计算器了')
collections模块
namedtuple 命名元组
# from collections import namedtuple # Point = namedtuple('point',['x','y','z']) # p1 = Point(1,2,3) # p2 = Point(3,2,1) # print(p1.x) # print(p1.y) # print(p1,p2)
纸牌花色和数字
from collections import namedtuple Card = namedtuple('card', ['suits', 'number']) c1 = Card('红桃', 2) print(c1) print(c1.number) print(c1.suits)
queue 队列
先进先出,里面的数据取完后,会阻塞在那里,不继续往下执行。
import queue q = queue.Queue() q.put([1,2]) q.put(3) q.put(4) print(q.get()) # [1,2] print(q.get()) # 3 print(q.get()) # 4 print(q.get()) # 阻塞 print(q.qsize()) # 打印当前队列中剩余的元素数量
deque 双端队列
两端都可以存取
from collections import deque dq = deque([1,2]) # deque([1, 2]) dq.append(3) # deque([1, 2, 3]) 从后面放入数据 dq.appendleft(0) # deque([0, 1, 2, 3]) 从前面放入数据 dq.insert(2,4) # deque([0, 1, 4, 2, 3]) 在指定位置插入数据 dq.pop() # deque([0, 1, 4, 2]) 从后面取数据 dq.popleft() # deque([ 1, 4, 2]) 从前面取数据 print(dq)
有序字典 OrderedDict
from collections import OrderedDict od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od) # OrderedDict的Key是有序的 print(od['a']) for k in od: print(k)
默认字典 defaultdict
from collections import defaultdict d = defaultdict(lambda : 5) # d['k'] = 4 print(d['k'])
json模块 和 pickle 模块
把某个数据类型转化为字符串的过程称之为序列化。
序列化的优点:
- 持久保存。内存只是临时保存数据的,无法永久保存。当我们断电或者重启程序,内存中关于这个程序的之前的数据都会被清空。但是如果我们在断电或重启程序前将所需的数据都保存到文件中,下次还可以再从文件中取出之前保存的数据,然后执行,这就是序列化。
- 跨平台交互。序列化不仅可以把序列化后的数据保存到文件写入硬盘,还可以通过网络传输的方式发送给别人的程序,如果发送数据和接受数据的双方约定好使用一种序列化的格式,那么便打破了平台、语言化差异带来的限制。实现跨平台数据的交互。
json模块
其他编程语言也在用,序列化出的数据其他语言也能用。
- 只能很少一部分的数据类型可以使用json转化为字符串,如数字,字符串,列表,字典,元组。
- 通用的序列化格式
# 代码演示 # 序列化后的数据保存到内存中dumps(),取loads() import json struct_data = { 0:'name', 1:'age', 2:'sex' } # 序列化 data = json.dumps(struct_data) # 将字典序列化成字符串,保存到内存中去 print(data,type(data))# {"0": "name", "1": "age", "2": "sex"} <class 'str'> # 注意:无论数据是怎样创建的,只要满足json格式(如果是字典,则字典内元素都是双引号),就可以json.loads出来,不一定非要dumps的数据才能loads出来 # 反序列化 data = json.loads(data) print(data,type(data)) # {'0': 'name', '1': 'age', '2': 'sex'} <class 'dict'>
# 序列化的数据保存到文件中json.dump(data,obj) # 取数据 json.load(obj) import json struct_data = { 0:'name', 1:'age', 2:'sex' } # 序列化 with open('json序列化.txt','w',encoding='utf8') as f: json.dump(struct_data,f) # 反序列化 with open('json序列化.txt','r',encoding='utf8') as f: data = json.load(f) print(data)
关于f-string格式化
f-string 格式化也可以将字典以字符串的形式写进文件中,但是写入的 字典 不符合 字典内元素都是用双引号的要求,所以无法将从文件中读取出的字符串形式的字典转化为字典类型。json也无法load出这个字典。
pickle模块
pickle序列化只能是python自己使用。相对于json的优点,就是可以序列化python中的所有数据类型,包括对象。
- 只能python自己使用
- 可以序列化python中的所有数据类型,包括对象
- 序列化保存到文件中的数据是二进制形式。无法读懂。
# 代码演示 # 保存到内存中 import pickle struct_data = { 0:'name', 1:'age', 2:'sex' } # 序列化 data = pickle.dumps(struct_data) print(data,type(data)) # 二进制类型 # 反序列化 data = pickle.loads(data) print(data,type(data)) # 字典类型
# 代码演示 # 保存到文件中 import pickle struct_data = { 0:'name', 1:'age', 2:'sex' } # 序列化(注意:pickle模块需要使用二进制存储,即wb 模式存储) with open('pickle序列化.txt','wb',encoding='utf8') as f: pickle.dump(struct_data,f) # 反序列化 with open('pickle序列化.txt','rb',encoding='utf8') as f: data = pickle.load(f) print(data)
从上方的代码演示可以看出,json和pickle使用方式一样,只是pickle在dump和load的时候操作文件都是以二进制的模式进行的。
hashlib模块
这个模块主要用于明文加密
hash是什么
hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。
hash值的特点:
- 知道传入的内容一样,得到的hash值一样,可用于非明文密码传输时密码校验
- 不能由hash值反解成内容,即可以保证非明文密码的安全性。
- 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的,可以用于对文本的hash处理。
# 代码演示 import hashlib m = hashlib.md5() m.update('hello'.encode('utf8')) print(m.hexdigest())
在网络中存在以撞库形式来破解密码的,为了防止密码被撞库,我们可以使用另一个hmac模块,它内部对我们创建key和内容做过某种处理后再加密。
# 如果要保证hmac模块最终结果一致,必须保证: # 1. hmac.new()括号内指定的初始key一样 # 2. 无论update多少次,检验的内容累加到一起是一样的内容 import hmac h1 = hmac.new(b'hash') print(h1,type(h1)) h1.update(b'hello') h1.update(b'world') print(h1.hexdigest()) # 905f549c5722b5850d602862c34a763e h2 = hmac.new(b'hash') h2.update(b'helloworld') print(h2.hexdigest()) # 905f549c5722b5850d602862c34a763e
logging模块
记录日志使用的模块
来源:https://www.cnblogs.com/chenych/p/10996407.html