python22期第八天(正则表达式-模块,总结)
课程内容:
1.collections模块
2.time模块
3.random模块
4.os模块
5.sys模块
6.re模块
7.login模块
8.hasblib 模块
9.序列化模块
1.collections模块
(1).使用模块必须先导入 # 需要注意的是 已知的所有模块名都不可以作为python文件名
每一个模块都有一个大致的功能
collections给我们提供了一些额外的数据类型
str int list dict tuple set float 内置数据类型
每一个类都是一个数据类型 自定义数据类型
a = 'a' # 实例化 str('a')
(2).python一切皆对象
a = 1
(3).from math import sqrt
collecctions模块是扩展我们数据类型的一个模块
tuple元组
p = (1,2) # 坐标
可命名元祖
Point = collections.namedtuple('point',['x','y']) p = Point(1,2) print(p) print(p.x) print(p.y)
在存储数据的基础上 严格的维持了一个秩序,数据的进出顺序
queue 队列 先进来的先出去 —— 售票
栈 先进来的后出去 —— 计算机的计算、算法
import queue # 队列 q = queue.Queue() l = list() q.put(1) # 放 q.put(2) # 放 print(q.get()) # 取 import collections dq = collections.deque() dq.append(1) dq.append(2) print(dq) print(dq.pop()) print(dq) dq.appendleft(5) print(dq.popleft()) print(dq) d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d.keys()) from collections import OrderedDict d = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(d.keys()) from collections import defaultdict dd = defaultdict(list) print(dd) dd['aaaaaaaaa'].append(1) print(dd) def func():return 5 dd = defaultdict(func) dd = defaultdict(lambda : 5) print(dd) dd['aaaaaaaaa'] print(dd) dd['aaaaaaaaa'] = 20 print(dd) a = 1 class B():pass def c():pass print(callable(a)) print(callable(B)) print(callable(c)) from collections import namedtuple Point = namedtuple('point',['x','y']) print(Point) p = Point(1,2) print(type(p)) class A:pass print(A) a = A() print(type(a))
2.time模块
(1.)时间的几种表示格式
print(time.time())
1530330328 unix时间戳时间
为什么要有时间戳时间 —— 计算机用的float
格式化时间 —— 人用的 年月日时分秒 str
print(time.strftime('%Y')) # year print(time.strftime('%m')) # month print(time.strftime('%d')) # day print(time.strftime('%H')) # hour print(time.strftime('%M')) # Minute print(time.strftime('%S')) # Second print(time.strftime('%c')) # year print(time.strftime('%m/%d/%Y %H:%M')) # year
时间戳时间float —— 给机器看的
结构化时间 —— 中间的过渡
格式化 %s —— 给人看的
(2).转换关系
timestamp = time.time() print(timestamp) ts2 = 3000000000 print(time.localtime()) struct_time = time.localtime(ts2) print(time.strftime('%m/%d/%Y %H:%M',struct_time)) struct_time = time.strptime('2020','%Y') print(time.mktime(struct_time)) print(time.strptime('2020','%Y'))
3.random 模块:随机生成
# random 随机
# 随机
# l = [1,2,3,'a']
# 从4项随机选两个
# 从4项随机选一个,选两次
# 2,2
# 6位 数字+大小写字母的 验证码
# 数字 0,9
# 字母 a-z A-Z # chr()
# 字母怎么来的???
# 每一次每一位上的值可能是字母也可能是数字?
# print(chr(65))
# print(chr(97))
# 0-9 数字
# 65-90 大写字母
# 97-122 小写字母
# 从数字 大小写字母中随机的选取一个
def random_code(num,alpha=True): import random code = '' for i in range(num): choice = str(random.randint(0,9)) if alpha: alpha_lower = chr(random.randint(65,90)) alpha_upper = chr(random.randint(97,122)) choice = random.choice([choice,alpha_lower,alpha_upper]) code += choice return code print(random_code(4,False))
4.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.popen("bash command).read() 运行shell命令,获取执行结果 os.environ 获取系统环境变量 os.path 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的大小 '''
5.sys 模块:
# print('3.6' in sys.version)
# print(sys.platform) # win32
# print(sys.path)
# 你的模块能不能被顺利的导入
# 取决于这个模块是否在你的sys.path路径中
# 路径的寻找是依据sys.path列表中的顺序查找的
# 找到一个符合条件的就停止了
import time
# print(sys.modules)
# 记载了我们已经导入的模块名以及这个模块的内存地址
# print(sys.argv)
# sys.exit() # 退出
# if len(sys.argv)>1 and sys.argv[1] == 'alex'and sys.argv[2] == 'alex3714':
# print('登陆成功')
# else:
# user = input('user:') # 阻塞
# pwd = input('pwd:')
# if user == 'alex' and pwd == 'alex3714': print('登陆成功')
6.re模块
# 正则表达式 ——字符串
# 和python语言,是一个独立的语法
# 是一个什么规则???
# 从一个巨大的字符串集合中,
# 根据规则来找到你想要的内容
# 或者判断某一段字符串是否是你规定的
# 条件
# 一个巨大的字符串
# 规则
# 结果
# 你想要的内容
#字符组中常用的范围
# 数字 [0-9]
# 字母 [A-Za-z]
# 数字 [A-Za-z0-9]
# 0,1
# 0,1,2,3,4,5,6,7
# 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
# [2\-5]
# -在字符组中有特殊的意义
# 如果你不希望它表示特殊意义,就用\进行转译
# 这样这个特殊的意义就被取消,它只表示它自己本身的意义
# 整数或小数
# 12
# 12.0
# 12.012
# '1 - 2 * ( (60-30 +-8 * 1024) - (-4*3)/ (16-3*2) )'
# while 循环
# 从这个字符串中先匹配出一个小括号
# 这个小括号里面不再有新的小括号了
# 从左到右依次匹配 乘除法
# '7.4*3'
# 首先要判断一下是除法还是乘法
# 21
import re
ret = re.findall('\d+(\.\d+)?', 'eva45.65+346[55] egon 35yuan15')
print(ret)
ret = re.findall('(\d)5', 'eva4565346[5555] egon 35yuan15')
print(ret) # findall特性 匹配的时候按照规则匹配,显示只显示分组内的
ret = re.findall('\[(\d+)\]', 'eva4565346[555] egon 35yuan15')
print(ret) # 在分组的开始加上?:表示取消分组优先
# ?做量词 表示0次或1次
# ?在量词后 表示惰性匹配
# ?:在分组开头 表示取消分组优先
# ret = re.search('(\d)5', 'eva4565346 egon 35yuan15')
# print(ret)
# if ret:
# print(ret.group())
# print(ret.group(0))
# print(ret.group(1))
# print(ret.group(2))
# 在search中没有正则规则的分组优先显示功能
# s = '1 - 2 * ( (60-30 +(-40/5) * (9 + 7 +10 )) - (-4*3)/ (16-3*2) )'
# print(eval(s))
# 去空格
#加减乘除 小括号算式
# 表达式的数据类型是str
# 不能用eval
# 算法 —— 中缀表达式 前缀 后缀
# 作业一定要写
# 从简单的地方开始写
# '60-30'
# 'a+b' /'a-b' /'a*b' / 'a/b'
# 首先判断是什么运算
# '+' 以加号为分隔符 split a,b 数据类型的转换 -- 小数
# 匹配乘除法
# \d+(\.\d+)?[*/]\d+(\.\d+)?
# 整体思路
# 有一个大字符串
# 从中匹配出括号,一个内部不再有括号的表达式 —— 先算括号里的
# 匹配这小表达式中的乘除法 —— 先乘除
# 后加减
# 替换
# 匹配
# 字符串的操作
7. login 模块
(1)login级别信息
import logging logging.debug('debug message') # 调试模式 logging.info('info message') # 基础正常的信息 logging.warning('warning message') # 警告信息 logging.error('error message') # 错误信息 logging.critical('critical message') # 批判的 严重错误
(2)默认不打印debug,和info
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='test.log', filemode='a') logging.debug('你好') # 调试模式 logging.info('info message') # 基础正常的信息 logging.warning('warning message') # 警告信息 logging.error('error message') # 错误信息 logging.critical('critical message') # 批判的 严重错误
# basicConfig
# 1.中文的乱码
# 2.不能同时向屏幕和文件中输入
8.hasblib模块
MD5简单加密方法:
import hashlib md5_obj = hashlib.md5() # 选择了md5算法 32位16进制的字符串0.0001 1 s = input('>>>') md5_obj.update(s.encode('utf-8')) print(md5_obj.hexdigest())
md5算法 —— 撞库
数字 字符串 import hashlib username = input('>>>') md5_obj = hashlib.md5(username.encode('utf-8')) # 选择了md5算法 32位16进制的字符串0.0001 1 s = input('>>>') md5_obj.update(s.encode('utf-8')) print(md5_obj.hexdigest())
校验文件一致性:如果文件大于5个G使用一下方法:
import os import hashlib def get_md5(file,n = 10240): with open(file, 'rb') as f1: md5_obj = hashlib.md5() file_size = os.path.getsize(file) while file_size>0: md5_obj.update(f1.read(n)) file_size -= n return md5_obj.hexdigest() def compare(file1,file2): return get_md5(file1) == get_md5(file2)
9.序列化模块:
序列化类型:json pickle shelve
序列化过程:
序列化:数据结构 —序列化—> 字符串
反序列化:字符串 -反序列化-〉数据结构
# 为什么需要序列化???
1.文件存储
2.网络传输
1. json支持的数据类型:字典 列表 数字类型 (json 字典的key只能是字符串)
序列化例子:
f = open('json_file','w') json.dump([1,2,3],f) # 只和文件相关 json.dump({'a':4,'b':5,'c':6},f) # 只和文件相关 f.close()
反序列化:
f = open('json_file','r') content = json.load(f) # 只和文件相关 f.close() print(content,type(content))
2.pickle 支持几乎所有数据类型 包括自定义的类和对象
# class A: # def __init__(self,name,age): # self.name = name # self.age = age # file = open('pickle_file','wb') # alex = A('alex',83) # pa = pickle.dump(alex,file) # file.close() # del alex # file = open('pickle_file','rb') # pal = pickle.load(file) # print(pal.name,pal.age) import pickle # file = open('pickle_file','wb') # pickle.dump({1,2,3},file) # pickle.dump({(1,2,3):456},file) # file.close() # file = open('pickle_file','rb') # while True: # try: # print(pickle.load(file)) # except EOFError: # break
json 和 pickle 的区别:
# json
# 结果可读
# 所有的语言都通用
# 数据类型有限
# pickle —— 游戏退出的存档
# 结果是bytes
# 只支持python语言
# 几乎支持所有数据类型

浙公网安备 33010602011771号