今天咱们来讲说Python中的模块:python
第三方模块linux
能够下载/安装/使用算法
第一步:将pip.exe 所在的目录添加到环境变量中
第二步:输入pip
第三步:pip install 要安装的模块名称 #pip install xlrd
报错缘由:
要求更新模块:python36 -m pip install --upgrade pip
安装成功不能导入:重启pycharm、从新安装
自定义模块shell
随着程序代码越写越多,不易维护,因此咱们把函数分组,放在不一样的文件中,这样每一个文件的代码块就较少,一个.py文件就是一个自定义模块数据库
这里有个大前提,就是你的py执行文件和模块同属于同个目录(父级目录),以下图:
执行文件main.py 和 模块文件pwcong模块同在python目录
pwcong模块提供的函数写在 __init__.py 里,里面只提供一个 hi 函数:
def hi():
print("hi")
执行文件main.py直接import自定义模块
import pwcong
pwcong.hi()
若是执行文件和模块不在同一个目录下,这时用import是找不到自定义模块的json
import sys
sys.path.append(r"C:\Users\Pwcong\Desktop\python")
import pwcong
pwcong.hi()
内置模块后端
python内部提供的功能。数组
Python中的模块有下面这些:安全
1、序列化模块:微信
序列化的目的:
①:以某种存储形式使自定义对象持久化;
②:将对象从一个地方传递到另外一个地方;
③:使程序更具维护性。
json模块:
json模块提供了四个功能:dumps、dump、loads、load
首先咱们来讲说dumps和loads:
dumps:将JSON格式的编码内容序列化成字符串格式的
源码:
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
1 obj: 表示是要序列化的对象。 2 3 fp: 文件描述符,将序列化的str保存到文件中。json模块老是生成str对象,而不是字节对象;所以,fp.write()必须支持str输入。 4 5 skipkeys: 默认为False,若是skipkeysTrue,(默认值:False),则将跳过不是基本类型(str,int,float,bool,None)的dict键,不会引起TypeError。 6 7 ensure_ascii: 默认值为True,能将全部传入的非ASCII字符转义输出。若是ensure_ascii为False,则这些字符将按原样输出。 8 9 check_circular:默认值为True,若是check_circular为False,则将跳过对容器类型的循环引用检查,循环引用将致使OverflowError。 10 11 allow_nan: 默认值为True,若是allow_nan为False,则严格遵照JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引起ValueError。 若是allow_nan为True,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)。 12 13 indent: 设置缩进格式,默认值为None,选择的是最紧凑的表示。若是indent是非负整数或字符串,那么JSON数组元素和对象成员将使用该缩进级别进行输入;indent为0,负数或“”仅插入换行符;indent使用正整数缩进多个空格;若是indent是一个字符串(例如“\t”),则该字符串用于缩进每一个级别。 14 15 separators: 去除分隔符后面的空格,默认值为None,若是指定,则分隔符应为(item_separator,key_separator)元组。若是缩进为None,则默认为(’,’,’:’);要得到最紧凑的JSON表示,能够指定(’,’,’:’)以消除空格。 16 17 default: 默认值为None,若是指定,则default应该是为没法以其余方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引起TypeError。若是未指定,则引起TypeError。 18 19 sort_keys: 默认值为False,若是sort_keys为True,则字典的输出将按键值排序。
例子:
1 import json 2 dic = {"name":"tom","age":23} 3 str_dic = json.dumps(dic) 序列化 将一个字典转换成一个字符串 4 print(type(str_dic),str_dic)
json转换完的字符串类型的字典中的字符串是由""表示的
1 import json 2 # 序列化,将python的值转换为json格式的字符串。 3 v = [12,3,4,{'k1':'v1'},True,'asdf'] 4 print(v,type(v)) 5 v1 = json.dumps(v) 6 print(v1,type(v1)) #[12, 3, 4, {"k1": "v1"}, true, "asdf"]
loads: 将json格式的字符串转换成python的数据类型
1 dic2 = json.loads(str_dic) #反序列化:将一个字符串格式的字典转换成一个字典 2 3 print(type(dic2),dic2) #<class 'dict'> 4 5 #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
1 v2 = '["alex",123]' 2 print(type(v2)) #列表类型的字符串结构 3 v3 = json.loads(v2) 4 print(v3,type(v3)) #将JSON类型的编码内容反序列化成为Python的内容 5 >>> ['alex', 123] <class 'list'> 6 7 v4 = [{1,2,3},True] #不能是元组类型,只能是集合、列表、字典类型 8 ret = json.dumps(v4) 9 print(ret)
dump 和 load(文件操做相关)
1 import json 2 f = open('json_file','w') 3 dic = {'k1':'v1','k2':'v2','k3':'v3'} 4 json.dump(dic,f) 5 f.close() 6 接收一个文件句柄,直接将字典转换成json字符串写入 7 8 import json 9 f = open('json_file','r') 10 dic2 = json.load(f) 11 f.close() 12 print(dic2,type(dic2)) 13 接收一个文件句柄,直接将文件中的json字符串转换成字典的数据结构返回
总结:
# json.load() #参数文件句柄(r), 将文件中字符串转换成字典
# json.dump() #对象(字典),文件句柄(w) 将字典转换字符串写入到文件中
# json.dumps() #对象(字典) 将字典转换成字符串
# json.loads() #字符串(字典) 将字符串转换成字典
json的格式化输出
1 import json 2 data = {'username':['李华','二愣子'],'sex':'male','age':16} 3 json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) 4 print(json_dic2)
结果:
1 { 2 "age":16, 3 "sex":"male", 4 "username":[ 5 "李华", 6 "二愣子" 7 ] 8 }
pickle模块:只用于Python编译器
不只能够序列化字典,列表...能够把python中任意的数据类型序列化
1 import pickle 2 print(pickle.dumps({'1':4})) #将对象转换成相似二进制的东西 3 print(pickle.loads(b'\x80\x03}q\x00X\x01\x00\x00\x001q\x01K\x04s.')) 4 #将一个堆相似于二进制的东西转换成字典 5 6 pickle.dump({'2':4},open('b','wb')) 7 d = pickle.load(open('b','rb')) 8 print(d)
总结:
josn,pickle 对比:
loads json里的将字符串转换成字典 pickle 将字节转换成字典
dumps json里的将字典转换成字符串 pickle 将字典转换成字节
load json里的将文件中的字符串转换成字典 pickle 将文件中的字节转换成字典
dump json里的将字典转换字符串写入到文件中,pickle 将字典转换成字节写入到文件中
shelve模块
1 import shelve 2 f = shelve.open('c',writeback=True) #建立文件 # writeback = True 回写 3 f['name'] = 'alex' 4 f['age'] = 18 5 print(f['name'],f['age'])
7 print(f) # 这样是查看不了字典 8 9 for i in f: 10 print(i) #获取到全部的键 11 12 print(f.keys()) #keys也不行 13 14 for i in f: 15 print(f[i]) #获取到全部的值
2、random 模块: 随机数模块
1 获取0-1之间的随机小数 2 import random 3 print(random.random())
1 获取指定范围的随机小数 2 import random 3 print(random.uniform(1,5))
1 获取范围内的随机整数 2 import random 3 print(random.randint(1,5)) 4 # 起始位置,终止位置 两头都包含
1 获取范围内的随机奇数和偶数: 2 import random 3 print(random.randrange(1,5,2)) #随机生成1-5的奇数 4 print(random.randrange(0,5,2)) #随机生成0-5的偶数 5 #起始位置,终止位置(不包含),步长
1 print(random.choice(['alex','wusir','eva_j'])) 2 从有序数据结构中随机选择一个
1 print(random.choices(['wusir','tialaing','taihei','ritian'],k=2)) 2 随机选择两个,可是有重复
1 print(random.sample(['wusir','tialaing','taihei','ritian'],k=2)) 2 随机选择两个,没有重复
主要应用场景:微信随机红包、验证码、随机数:
1 li = [1,2,3,4,6] 2 random.shuffle(li) # 洗牌 打乱顺序 3 print(li) 4 5 print(chr(65),chr(90),chr(97),chr(122)) 6 7 U = chr(random.randrange(65,91)) 8 L = chr(random.randrange(97,123)) 9 n1 = random.randrange(0,10) 10 n2 = random.randrange(0,10) 11 print(U, L,n1,n2)
微信抢红包程序:
1 import random 2 def red_pac(money,num): 3 ret = random.sample(range(1,money*100),num-1) 4 ret.sort() 5 ret.insert(0,0) 6 ret.append(money*100) 7 for i in range(len(ret)-1): 8 value = ret[i+1] - ret[i] 9 yield value/100 10 11 g = red_pac(200,10) 12 for i in g: 13 print(i)
3、time模块
①时间戳time.time()
②结构化时间time.localtime()
③字符串时间time.strftime()
1 时间戳 -- 结构化时间 #time.localtime() 2 结构化时间 -- 字符串时间 #time.strftime() 3 4 字符串时间 -- 结构化时间 #time.strptime 5 结构化时间 -- 时间戳 #time.mktime()
例题:
1 t = '2019-03-20 10:40:00' 2 把这个时间向后退一个月 3 # 1.转成结构化 4 f = time.strptime(t,'%Y-%m-%d %X') 5 # 2.结构化时间转成时间戳 6 ts = time.mktime(f) 7 # 3.将时间戳向大变 8 new_ts = ts + 86400 * 30 9 # 4.将最新的时间戳转成结构化时间 10 new_f = time.localtime(new_ts) 11 # 5.将结构化时间转成字符串时间 12 print(time.strftime('%Y-%m-%d %X',new_f)) 13 14 获取当前时间求前一月的如今时间 15 1.获取时间戳进行减法计算 16 new_ts = time.time() - 30*86400 17 # 2.最新的时间戳转成结构化时间 18 new_f = time.localtime(new_ts) 19 # 3.将结构化时间转成字符串时间 20 print(time.strftime('%Y-%m-%d %X',new_f))
4、os模块:主要和当前电脑操做系统作交互
os模块与文件夹相关:
1 import os 2 os.makedirs('app/a/b/c') # 递归建立文件 *** 3 os.removedirs('app/a/b/c') # 递归删除文件, 当这个要删除的目录有文件就中止删除 *** 4 os.mkdir('app') # 建立单个目录 *** 5 os.rmdir('app') # 删除单个目录,目录若是有东西就报错不进行删除 *** 6 print(os.listdir('D:\PyCharmProject\s20\day14'))
#查看某个目录下的内容****
os模块和文件相关:
1 os.remove() #删除这个文件,删除了就不能恢复了 ***** 2 os.rename() #修改文件的名字 *****
与操做系统相关:
1 print(repr(os.sep)) #\\ 2 C:\Users\lucky\Documents\Tencent Files\932023756\FileRecv 3 路径符号
1 print(os.popen('dir').read()) *** 2 #在写程序的时候能够下发一些操做系统的指令 3 #在linux系统上至关于发shell命令
4 os.environ 获取系统环境变量
与path执行路径相关
1 print(os.path.abspath('b')) **** 2 获取当前文件的绝对路径 3 print(os.path.split(r'D:\PyCharmProject\s20\day14\b')) 4 将这个文件的绝对路径分红目录和文件 5 print(os.path.basename(r'D:\PyCharmProject\s20\day14\b')) ** 6 获取的是这个文件的名字 7 print(os.path.dirname(r'D:\PyCharmProject\s20\day14\b')) *** 8 获取的是这个文件的目录路径 9 print(os.path.exists(r'D:\PyCharmProject\s20\day10\07 今日总结.py')) ** 10 判断这个文件是否存在 11 print(os.path.isabs(r'D:\PyCharmProject\s20\day14\b')) 12 判断是不是绝对路径 13 14 print(os.path.join('C:\\','app','a','b')) ***** 15 #路径拼接的 软件开发规范 框架 16 17 os.stat() 18 19 print(os.stat('b').st_size) #获取文件大小 ,坑目录 *** 20 print(os.getcwd()) # 获取工做路劲 *** 21 22 os.chdir('D:\PyCharmProject\s20\day13') # 路劲切换 * 23 print(os.getcwd())
5、sys模块:Python交互解释器交互的
import sys
1 print(sys.argv[-1]) *** 2 接受cmd方式调用 后边的参数会传递进来 3 linux系统上 -- 后端开发 -- 数据库(文件) ip + 端口 4 5 print(sys.path) # 添加自定义模块路径的 # ****** 6 7 print(sys.version) # 版本 获取解释的版本号 8 9 sys.platform = 'win1988' 10 11 print(sys.platform) #获取当前操做系统的平台位数 # 可进行修改的 12 13 print(sys.exit(1))
6、hashlib
应用:①密文形式存储用户登陆密码信息;
②利用其不可逆不可改的特性验证数据是否被篡改。
1 import hashlib 2 md5 = hashlib.md5('盐'.encode('utf-8')) # 选择加密方式 加盐 3 md5.update('alex3714'.encode('utf-8')) # 将输入的明文转成字节而后进行加密 4 print(md5.hexdigest()) # 打印生成的密文
1 user,pwd = input('user|pwd:').strip().split('|') 2 import hashlib 3 4 md5 = hashlib.md5(str(user).encode('utf-8')) 5 md5.update(pwd.encode('utf-8')) 6 print(md5.hexdigest())
以用户名做为加密方式:
1 user,pwd = input('user|pwd:').strip().split('|') 2 import hashlib 3 4 md5 = hashlib.md5(str(user).encode('utf-8')) 5 md5.update(pwd.encode('utf-8')) 6 print(md5.hexdigest())
加密方式除了md5还有sha1,sha256,sha512,其md5以及被破解,但sha系列的hash算法还很安全。
利用hashlib算法完成登陆和注册页面的需求:
1 hashlib 注册系统 2 import hashlib 3 def md5(username,password): 4 md5 = hashlib.md5(username[::-1].encode('utf-8')) 5 md5.update(password.encode('utf-8')) 6 return md5.hexdigest() 7 8 def get_line(): 9 with open('userinfo', encoding='utf-8') as f: 10 for line in f: 11 user, pwd = line.strip().split(',') 12 yield user,pwd 13 14 def register(): 15 flag = True 16 while flag: 17 username = input('user :') 18 password = input('passwd :') 19 for user,pwd in get_line(): 20 if user == username: 21 print('您输入的用户名已经存在') 22 break 23 else: 24 flag = False 25 password = md5(username,password) 26 with open('userinfo',encoding='utf-8',mode='a') as f: 27 f.write('%s,%s\n'%(username,password))
登陆系统
1 def login(): 2 username = input('user :') 3 password = input('passwd :') 4 for user,pwd in get_line(): 5 if username == user and pwd == md5(username,password): 6 return True 7 8 ret = login() 9 if ret: 10 print('登录成功')
7、re模块
8、shutil模块 :删除文件夹(包括文件夹内的文件,)
1 import shutil 2 3 shutil.rmtree(path)
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删除。 5 C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py D:/test 6 C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py 7 """ 8 import sys 9 10 # 获取用户执行脚本时,传入的参数。 11 # C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py D:/test 12 sys.argv = ["D:/code/s21day14/7.模块传参.py", "D:/test"] 13 path = sys.argv[1] 14 15 # 删除目录 16 import shutil 17 18 shutil.rmtree(path)
9、getpass模块(密码不显示,在终端运行)
1 import getpass 2 3 pwd = getpass.getpass('请输入密码:') 4 if pwd == '123': 5 print('输入正确')