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语言
# 几乎支持所有数据类型

 

posted @ 2018-07-05 19:15  MR_dy  阅读(106)  评论(0)    收藏  举报