Python - 常用模块

自定义模块day16
# 什么是模块?
# 分类  认证 ,视频 ,评论

# 模块能干什么?

# 1.文件化管理 提高可读性,避免重复代码
# 2.拿来就用 (避免重复造轮子) python中类库特别多

# 定义一个模块
# 一个文件就是一个模块  (模块就是一个工具箱  工具(函数))

# import时会做三件事:
# 1.将test.py文件中所有代码读取到当前文件
# 2.当前文件开辟空间
# 3.等待被调用

# import 导入同一个模块名是,只执行一次
import test as t  # 工具箱名字过长可以起别名

# import 和 from 的区别:
# 1.from只能执行导入的工具
# 2.import 能够执行整个模块中所有的功能
# 3.from容易将当前文件中定义的工能覆盖
# 4.from比import灵活

# import 只能导入当前文件夹下的模块

# import 后边不能加点操作

模块导入顺序:
#sys.path.append(r"C:\Users\oldboy\Desktop")
# 内存 > 内置 > 第三方> 自定义
#sys.path.insert(0,r"C:\Users\oldboy\Desktop")
# 内存 > 自定义 > 内置 > 第三方

模块的两种用法: if __name__ == "__main__"
# 1.当做模块被导入   import from
# 2.当做脚本被被执行

只有py文件当做模块被导入时,字节码才会进行保留


 以后导入模块会产生的坑:1.注意自己定义模块的名字
        2.注意自己的思路 -- 循环导入时建议 导入模式放在需要的地方
        通过__all__ 控制要导入的内容


time模块

import time  # 内置模块 -- 标准库

# print(time.time())  # 时间戳  浮点数  秒
# time.sleep(3)  # 秒

# 将时间戳转换成结构化时间
# print(time.localtime(time.time()))   # 命名元组
# print(time.localtime(time.time())[0])
# print(time.localtime(time.time()).tm_year)

# 将结构化时间转换成字符串
# time_g = time.localtime()
# print(time.strftime("%Y-%m-%d %H:%M:%S",time_g))

# 将字符串转换成结构化时间
# str_time = "2018-10-1 10:11:12"
# time_g = time.strptime(str_time,"%Y-%m-%d %H:%M:%S")

# 将结构化时间转换成时间戳
# print(time.mktime(time_g))

# str_time = "2016-10-1 10:11:12"
# time_int = time.time() - time.mktime(time.strptime(str_time,"%Y-%m-%d %H:%M:%S"))
# print(time.localtime(time_int))

# 总结:
# time.time() 时间戳
# time.sleep() 睡眠
# time.localtime() 时间戳转结构化
# time.strftime() 结构化转字符串
# time.strptime() 字符串转结构化
# time.mktime() 结构化转时间戳
# %Y 年
# %m 月
# %d 日
# %H 时间
# %M 分钟
# %S 秒
datetime 模块


from datetime import datetime,timedelta
# print(datetime.now())  # 获取当前时间

# print(datetime(2018,10,1,10,11,12) - datetime(2011,11,1,20,10,10))
# 指定时间

# 将对象转换成时间戳
# d = datetime.now()
# print(d.timestamp())

# 将时间戳转换成对象
# import time
# f_t = time.time()
# print(datetime.fromtimestamp(f_t))

#将对象转换成字符串
# d = datetime.now()
# print(d.strftime("%Y-%m-%d %H:%M:%S"))

# 将字符串转换成对象
# s = "2018-12-31 10:11:12"
# print(datetime.strptime(s,"%Y-%m-%d %H:%M:%S"))

# 可以进行加减运算

# from datetime import datetime,timedelta
# print(datetime.now() - timedelta(days=1))
# print(datetime.now() - timedelta(hours=1))
random -- 随机数
import random

print(random.randint(1,50))
选择1-50之间随机的整数
print(random.random())
0-1 之间随机小数,不包含1
print(random.uniform(1,10))
1- 10 之间随机小数,不包含10

print(random.choice((1,2,3,4,5,7)))
从容器中随机选择一个
print(random.choices((1,2,3,4,5,7),k=3))
从容器中随机选择3个元素,以列表的形式方式,会出现重复元素
print(random.sample((1,2,3,4,5,7),k=3))
从容器中随机选择3个元素,以列表的形式方式,不会出现重复元素
print(random.randrange(1,10,2))  # 随机的奇数或随机的偶数

lst = [1,2,3,4,5,6,7]
random.shuffle(lst)
洗牌 将有序的数据打散
print(lst)
random -- 随机数
import random

print(random.randint(1,50))
选择1-50之间随机的整数
print(random.random())
0-1 之间随机小数,不包含1
print(random.uniform(1,10))
1- 10 之间随机小数,不包含10

print(random.choice((1,2,3,4,5,7)))
从容器中随机选择一个
print(random.choices((1,2,3,4,5,7),k=3))
从容器中随机选择3个元素,以列表的形式方式,会出现重复元素
print(random.sample((1,2,3,4,5,7),k=3))
从容器中随机选择3个元素,以列表的形式方式,不会出现重复元素
print(random.randrange(1,10,2))  # 随机的奇数或随机的偶数

lst = [1,2,3,4,5,6,7]
random.shuffle(lst)
洗牌 将有序的数据打散
print(lst)
软件开发规划--分文件day17

当代码存放在一个py文件中时
1.不便于管理 修改 增加
2.可读性差
3.加载速度慢

#Django  --雏形

约定俗称
1.启动文件   启动接口    
2.公共文件   大家需要的功能  
3.配置文件   (静态文件)变量
4.主逻辑     核心   
5.用户相关数据   账号和密码等文件
6.日志       记录主要信息,记录开发人员的行为

sys 模块   

#sys.path              模块查找的顺序 ***
#sys.argv              只能在终端中执行**
#sys.modules           查找加载到的内存模块
#sys.platform          查找当前操作系统平台
#sys.version           查看当前解释器的版本

序列化模块
1. json
2. pickle
#4个方法 2组
dumps    loads  ----用于网络传输
dump     load   ----用于文件存储

# s = json.dumps(lst)  #序列
# l = json.loads(s)  # 反序列

将数据类型转换成字符串(序列化),将字符串转成原数据类型(反序列)
能够序列: 字典,列表,元组序列后变成列表
dump    将源数据类型转化成字符串.写入到文件中 
load	将文件中的字符串转成源数据类型

import json
# lst = [1,2,3,4,5]
# with open("a","a",encoding="utf-8")as f:
#     f.write(json.dumps(lst)+"\n")

# with open("a","r",encoding="utf-8")as f1:
#     for i in f1:
#         l = json.loads(i)
#         print(l)


2. pickle
只要python有,几乎可以序列python中所有的数据类型,匿名函数不能序列

# import pickle
# def func():
#     print(1)
#
# a = pickle.dumps(func)   # 将原数据类型转换成类似字节的内容
# print(pickle.loads(a))   # 将类似字节的内容转换成原数据类型

os 模块


# 工作路径:
import os   # os是和操作系统做交互,给操作发指令
# print(os.getcwd())  # 获取当前文件工作的路径     ***
# os.chdir("D:\Python_s25\day16")  # 路径切换     **
# print(os.getcwd())
# print(os.curdir)
# print(os.pardir)


# 文件夹   ***
# os.mkdir("a2")  # 创建文件夹
# os.rmdir("a2")  # 删除文件夹
# os.makedirs('a1/a2/a3')  # 递归创建文件夹
# os.removedirs("a1/a2/a3") # 递归删除文件夹
# print(os.listdir(r"D:\Python_s25\day17"))  # 查看当前文件下所有的内容


# 文件 ***
# os.remove(r"D:\Python_s25\day17\a")      #删除文件,彻底删除 找不回来
# os.rename()                              # 重命名


# 路径
# print(os.path.abspath("test"))   # 返回的是绝对路径     ***
# print(os.path.split(r"D:\Python_s25\day17\test"))  #将路径分割成一个路径和一个文件名 **
# print(os.path.dirname(r"D:\Python_s25\day17\test"))  #获取到父目录                   ***
# print(os.path.basename(r"D:\Python_s25\day17\test")) #获取文件名  **
# print(os.path.join("D:\Python","day17","test"))        # 路径拼接   ***(非常重要)

# 判断
# print(os.path.exists(r"D:\Python_s25\day17\blog"))  # 判断当前路劲是否存在  **
# print(os.path.isabs(r"D:\Python_s26\day17\blog"))     # 判断是不是绝对路径  **
# print(os.path.isdir(r"D:\Python_s25\day17\blog"))        # 判断是不是文件夹 **
# print(os.path.isfile(r"D:\Python_s25\day17\blog"))           # 判断是不是文件  **

# print(os.path.getsize(r"D:\Python_s25\day17\01 今日内容.py"))  # 获取文件大小
# print(os.path.getsize(r"D:\Python_s25"))  # 获取文件大小                        ***
re 模块(正则表达式)day18

\w   匹配字母 数字 下划线 中文
\W   匹配非字母 数字 下划线 中文

\s   匹配任意的空白符
\S	 匹配非任意的空白符

\d 	 匹配数字
\D	 匹配非数字

\A	 从字符串开头匹配
\Z	 匹配字符串的结束

\n	 匹配一个换行符
\t 	 匹配一个制表符

^	 匹配字符串的开始
$	 匹配字符串的结尾

. 	 匹配任意字符,除了换行符,当re.DOTALL标记指定时,则可以匹配包括换行符的任意字符
[...]  	匹配字符组中的字符 	

...	  	匹配除了字符组中的字符的所有字符
*	 	匹配0个或多个左边的字符
+	 	匹配一个或多个左边的字符
?	 	匹配0个或1个左边的字符,非贪婪方式.

{n}	 	精准匹配n个前面的表达式.
{n,m}  	匹配n到m次由前面的正则表达式定义的片段,贪婪方式
ab	 	匹配a或者b
()	 	匹配括号内的表达式,也表示一个组


# 面试题:
# search 和 match 区别

# search 从任意位置开始查找
# match 从头开始查看,如果不符合就不继续查找了
# group()进行查看
列子:
# print(re.search("a.+","lexaaaa,bssssaaaasa,saaasaasa").group())
# print(re.match("a.+","alexalexaaa,bssssaaaasa,saaasaasa").group())

split  --  分割
 print(re.split("[:;,.!#]","alex:dsb#wusir.djb"))
    
sub -- 替换
# s = "alex:dsb#wusir.djb"
# print(re.sub("d","e",s,count=1))

compile 定义匹配规则
# s = re.compile("\w")
# print(s.findall("alex:dsb#wusir.djb"))




包day19

管理模块(文件化)
什么事包: 文件下具有__init__.py的就是一个包

__file__获取当前文件的路径

路径: 绝对路径:从最外层(bake)包.查找的就是绝对路径 相对路径:.就是相对路径, ..是上一级目录 

在使用相对路径的时候一定要在于bake同级的文件中测试 我们需要在和bake同级的test.py中测试

日志

# logging -- 日志
# 1.记录用户的信息
# 2.记录个人流水
# 3.记录软件的运行状态
# 4.记录程序员发出的指令
# 5.用于程序员代码调试

# 日志中要记录的信息
# 默认从warning开始记录

# 手动挡
# import logging
# logging.basicConfig(
#     level=logging.DEBUG,
#     format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
#                     datefmt='%Y-%m-%d %H:%M:%S',
#                     filename="test.log",
#                     filemode="a",
# )
#
#
# logging.debug("你是疯儿,我是傻") # debug 调试
# logging.info("疯疯癫癫去我家")   # info 信息
# logging.warning("缠缠绵绵到天涯")   # info 警告
# logging.error("我下不床")           # error 错误
# logging.critical("你回不了家")        # critical 危险


# 自动挡
# import logging
# # 初始化一个空日志
# logger = logging.getLogger()   # -- 创建了一个对象
# # 创建一个文件,用于记录日志信息
# fh = logging.FileHandler('test.log',encoding='utf-8')
# # 创建一个文件,用于记录日志信息
# fh1 = logging.FileHandler('test1.log',encoding='utf-8')
# # 创建一个可以在屏幕输出的东西
# ch = logging.StreamHandler()
# # 对要记录的信息定义格式
# msg = logging.Formatter('%(asctime)s - [line:%(lineno)d] %(filename)s - %(levelname)s - %(message)s')
# # 对要记录的信息定义格式
# msg1 = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
# # 设置记录等级
# logger.setLevel(10) or logger.setLevel(logging.DEBUG)
# # 等级对应表
# '''
# DEBUG - 10
# INFO - 20
# WARNING - 30
# ERROR - 40
# CRITICAL - 50
# '''
# 将咱们设置好的格式绑定到文件上
# fh.setFormatter(msg)
# fh1.setFormatter(msg)
# # 将咱们设置好的格式绑定到屏幕上
# ch.setFormatter(msg1)
# 将设置存储日志信息的文件绑定到logger日志上
# logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
# logger.addHandler(fh1)
# logger.addHandler(ch)
# # 记录日志
# logger.debug([1,2,3,4,])
# logger.info('logger info message')
# logger.warning('logger warning message')
# logger.error('logger error message')
# logger.critical('logger critical message')

hashlib 加密- 校验

1.加密
2.校验

加密的方式  1.md5,sha1,sha256,sha512
		  2.sha512 加密速度慢,安全系数高
    
 明文(123adsa) -- 字节 -- 密文(bs2501153023ras32rf150q23r13ar)  

1.当要加密的内容相同是.你的秘闻一定是一样的
2.当你的名人不一样是.密文不一定一样
3不可逆

例初始
import hashlib
md5 = hashlib.md5()  <== 初始化
md5.update('alex'.encode('utf-8')) <==将明文转成字节添加到新初始化的md5中
print(md5.hexdigest()) <== 进行加密

加盐
加固定盐
import hashlib
md5 = hashlib.md5('加盐'.encode('utf-8'))
md5.update("alex".encode("utf-8")) <==将明文转换成字节添加到新初始化的md5中
print(md5.hexdigest())   # 进行加密

加动态盐
# import hashlib
# user = input("username:")
# pwd = input("password:")
#
# md5 = hashlib.md5(user.encode("utf-8"))   # 初始化
# md5.update(pwd.encode("utf-8"))   # 将明文转换成字节添加到新初始化的md5中
# print(md5.hexdigest())   # 进行加密

 校验
    
    
    # import hashlib
# md5 = hashlib.md5()
# md5.update(b"afdadfadfadsfafasd")
# print(md5.hexdigest())

# import hashlib
# def file_check(file_path):
#     with open(file_path,mode='rb') as f1:
#         md5= hashlib.md5()
#         while True:
#             content = f1.read(1024)   # 2049 1025 1
#             if content:
#                 md5.update(content)
#             else:
#                 return md5.hexdigest()
# print(file_check('python-3.6.6-amd64.exe'))



collection 基于python自带的数据类型智商额外增加的几个数据类型

# 1.namedtuple: 生成可以使用名字来访问元素内容的tuple
命名元组
 from collections import namedtuple
 limit = namedtuple("limit",["x","y"])
 l = limit(1,2)
 print(l.x)
 print(l[0])

# 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

# 双端队列
from collections import deque
 lst = [1,2,3,4]

 deque = [1,2,3,4]
 deque.append(1)
 deque.remove(1)
 print(deque)


# 3.Counter: 计数器,主要用来计数
 计数 返回一个字典
lst=[1,2,112,312,312,31,1,1,1231,23,123,1,1,1,12,32]
d = Counter(lst)
print(list(d.elements()))
print(dict(d))



# 4.OrderedDict: 有序字典
from collections import OrderedDict
有序字典(python2版本)  -- python3.6 默认是显示有序
dic = OrderedDict(k=1,v=11,k1=111)
print(dic)
print(dic.get("k"))
dic.move_to_end("k")

# 5.defaultdict: 带有默认值的字典
from collections import defaultdict
 默认字典

 dic = defaultdict(list)
 dic[1]
 print(dic)

# 队列:先进先出
# 栈:先进后出  --  栈顶

defaultdict: 带有默认值的字典
    
print(dict(Counter(s)))  # ***统计元素出现的次数


posted @ 2020-03-05 12:51  赵刚、  阅读(109)  评论(0编辑  收藏  举报